正则表达式分裂

ind*_*iag 0 python regex

我试着理解python中的正则表达式.如何用正则表达式分割下面的句子?

"familyname, Givenname A.15.10"
Run Code Online (Sandbox Code Playgroud)

这就像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)
Run Code Online (Sandbox Code Playgroud)

它给了我这样的结果

 ['Wegner', ' Sven Ake G', '15.10\n'] 
Run Code Online (Sandbox Code Playgroud)

我希望有类似的东西

 ['Wegner', ' Sven Ake', 'G', '15', '10']. any idea?
Run Code Online (Sandbox Code Playgroud)

geo*_*org 7

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

  • "姓氏"是第一个逗号之前的所有内容
  • "名字"就是"办公室"之前的一切
  • "office"由字符串末尾的非空格字符组成

这转换为正则表达式语言,如下所示:

rr = r"""
    ^         # begin
    ([^,]+)   # match everything but a comma
    (.+?)     # match everything, until next match occurs
    (\S+)     # non-space characters
    $         # end
"""
Run Code Online (Sandbox Code Playgroud)

测试:

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')]
Run Code Online (Sandbox Code Playgroud)

更新:

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')]
Run Code Online (Sandbox Code Playgroud)