正则表达式分裂

时间:2012-06-17 11:22:11

标签: python regex

我试着理解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?

3 个答案:

答案 0 :(得分:7)

在正则表达式世界中,通常更容易“匹配”而不是“分裂”。当你“匹配”时,你直接告诉RE引擎你正在寻找什么类型的子串,而不是专注于分离字符。你问题中的要求有点不清楚,但我们假设

  • “surname”是第一个逗号之前的所有内容
  • “name”就是“办公室”之前的一切
  • “office”由字符串末尾的非空格字符组成

这就像这样转换为正则表达式语言:

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 $”)。