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

时间:2015-09-25 14:45:47

标签: python regex capturing-group

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

他们的名字是这种格式:最后,第一。

其中一些人有连字符。有些人不会。

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

输入:

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', '']

我做错了什么?

1 个答案:

答案 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