我需要从很长的字符串中提取人名。
他们的名字是这种格式:最后,第一。
其中一些人有连字符。有些人不会。
我尝试使用较小的字符串:
输入:
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', '']
我做错了什么?
答案 0 :(得分:2)
使用
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