我正在尝试从具有以下模式的字符串中捕获姓氏,名字和数字:
str = "Doe, John; 620 Eisenberg, Andrew; 253"
以下代码行似乎捕获了姓氏和名字,但是当我包含该数字的部分时返回None:
strfind = re.findall(r'(?P<last>[A-Z][A-Za-z]+), (?P<first>[A-Z][A-Za-z]+): (?P<num>\d+)', str, re.M|re.I)
print(strfind)
抱歉,无法让Verbose版本合作 我尝试在括号外面加上一个逗号和一个冒号,用于最后和第一个,以便将其包含在搜索中,以捕获前面的字符串,但是没有#c;似乎工作。同样,我尝试在 num 组的末尾使用空格。
排除 num 组,我得到以下输出:
[(&#39; Doe&#39;,&#39; John&#39;),(&#39; Eisenberg&#39;,&#39; Andrew&#39;)]
答案 0 :(得分:2)
正如@Kasramvd建议的那样,将:
替换为;
,效果非常好:
>>> import re
>>> s = "Doe, John; 620 Eisenberg, Andrew; 253"
>>> re.findall(r'(?P<last>[A-Z][A-Za-z]+), (?P<first>[A-Z][A-Za-z]+); (?P<num>\d+)', s, re.M|re.I)
[('Doe', 'John', '620'), ('Eisenberg', 'Andrew', '253')]
如果您希望结果列出字典格式,请使用finditer()
和groupdict()
:
>>> results = re.finditer(r'(?P<last>[A-Z][A-Za-z]+), (?P<first>[A-Z][A-Za-z]+); (?P<num>\d+)', s, re.M|re.I)
>>> [m.groupdict() for m in results]
[
{'num': '620', 'last': 'Doe', 'first': 'John'},
{'num': '253', 'last': 'Eisenberg', 'first': 'Andrew'}
]
答案 1 :(得分:0)
请尝试以下方法:
>>> input = "Doe, John; 620 Eisenberg, Andrew; 253"
>>> import re
>>> tmpLst = re.split(r'[;,\s]\s*', input)
>>> print tmpLst
['Doe', 'John', '620', 'Eisenberg', 'Andrew', '253']
>>> output = []
>>> for i in range(0, len(tmpLst), 3):
... output.append(tuple(tmpLst[i:i+3]))
...
>>> print output
[('Doe', 'John', '620'), ('Eisenberg', 'Andrew', '253')]