Skip to main content
 首页 » 编程设计

Python:正则表达式:使用一个正则表达式检测带连字符的名称和非带连字符的名称

2024年10月24日29lonelyxmas

我需要从一个很长的字符串中提取人名。

他们的名字采用以下格式:LAST,FIRST。

其中一些人的名字带有连字符。有些没有。

我尝试使用更小的字符串:

输入:

import re 
text = 'Smith-Jones, Robert&Epson, Robert' 
pattern = r'[A-Za-z]+(-[A-Za-z]+)?,\sRobert' 
print re.findall(pattern, text) 

预期输出:

['Smith-Jones, Robert', 'Epson, Robert'] 

实际输出:

['-Jones', ''] 

我做错了什么?

请您参考如下方法:

使用

import re 
text = 'Smith-Jones, Robert&Epson, Robert' 
pattern = r'[A-Za-z]+(?:-[A-Za-z]+)?,\sRobert' 
print re.findall(pattern, text) 
# => ['Smith-Jones, Robert', 'Epson, Robert'] 

只需将捕获组设为非捕获即可。问题是 findall 返回捕获组值,如果它们在正则表达式模式中指定的话。因此,在此模式中解决此问题的最佳方法是将 (...)? 替换为 (?:...)?。

参见 IDEONE demo