我试着理解python中的正则表达式。如何用正则表达式分割下面的句子?
"familyname, Givenname A.15.10"
这就像python正则表达式http://docs.python.org/library/re.html中的电话簿。该人可能有2个或更多的姓氏和2个或更多的名字。在家族名称存在之后','并且在给定名称存在之后''。最后一个是人的办公室。在知道之前我做了什么
import re
file=open('file.txt','r')
data=file.readlines()
for i in range(90):
person=re.split('[,\.]',data[i],maxsplit=2)
print(person)
它给我一个像这样的结果
['Wegner', ' Sven Ake G', '15.10\n']
我想要像
这样的东西 ['Wegner', ' Sven Ake', 'G', '15', '10']. any idea?
答案 0 :(得分:7)
在正则表达式世界中,通常更容易“匹配”而不是“分裂”。当你“匹配”时,你直接告诉RE引擎你正在寻找什么类型的子串,而不是专注于分离字符。你问题中的要求有点不清楚,但我们假设
这就像这样转换为正则表达式语言:
rr = r"""
^ # begin
([^,]+) # match everything but a comma
(.+?) # match everything, until next match occurs
(\S+) # non-space characters
$ # end
"""
测试:
import re
rr = re.compile(rr, re.VERBOSE)
print rr.findall("de Batz de Castelmore d'Artagnan, Charles Ogier W.12.345")
# [("de Batz de Castelmore d'Artagnan", ', Charles Ogier ', 'W.12.345')]
更新
rr = r"""
^ # begin
([^,]+) # match everything but a comma
[,\s]+ # a comma and spaces
(.+?) # match everything until the next match
\s* # spaces
([A-Z]) # an uppercase letter
\. # a dot
(\d+) # some digits
\. # a dot
(\d+) # some digits
\s* # maybe some spaces or newlines
$ # end
"""
import re
rr = re.compile(rr, re.VERBOSE)
s = 'Wegner, Sven Ake G.15.10\n'
print rr.findall(s)
# [('Wegner', 'Sven Ake', 'G', '15', '10')]
答案 1 :(得分:3)
您要做的是先将姓氏拆分为
familyname, rest = text.split(',', 1)
然后你想用右边的第一个空格拆分办公室。
givenname, office = rest.rsplit(' ', 1)
答案 2 :(得分:0)
假设姓氏没有逗号,您可以轻松地使用它们。鉴于名称对点是明智的。例如:
Harney, PJ A.15.10
Harvey, P.J. A.15.10
这意味着您可能应该在末尾用掩码修剪记录的其余部分(姓氏出来)(正则表达式“maskpattern $”)。