0

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

3 回答 3

7

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

  • “姓”是第一个逗号之前的所有内容
  • “姓名”是“办公室”之前的一切
  • "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')]
于 2012-06-17T11:42:55.393 回答
3

您要做的是首先将姓氏除以 ,

familyname, rest = text.split(',', 1)

然后你想用右边的第一个空间分割办公室。

givenname, office = rest.rsplit(' ', 1)

于 2012-06-17T11:34:50.080 回答
0

假设姓氏没有逗号,您可以轻松使用它们。给定的名称对点很敏感。例如:

Harney, PJ A.15.10
Harvey, P.J. A.15.10

这意味着您可能应该通过最后的掩码(正则表达式“maskpattern $”)修剪记录的其余部分(姓氏已出)。

于 2012-06-17T11:39:21.720 回答