0

私はPythonの正規表現を理解しようとしています。次の文を正規表現で分割するにはどうすればよいですか?

"familyname, Givenname A.15.10"

これは、pythonregexhttp://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エンジンに直接伝えます。あなたの質問の要件は少し不明確ですが、それを仮定しましょう

  • 「surname」は最初のコンマの前のすべてです
  • 「名前」は「オフィス」の前のすべてです
  • 「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 に答える