在Python中使用正则表达式中的变量

时间:2016-07-21 01:45:48

标签: python regex

我正在尝试从具有以下模式的字符串中捕获姓氏,名字和数字:

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;)]

2 个答案:

答案 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')]