1

次のような文字列からコンテンツを抽出しようとしています。

A.content content 
  content 
B.content  C. content content
content D.content

そして、これがPythonでの私の正規表現パターンです:

reg = re.compile(r''' 
     (?xi)
     (\w\.\t*\s*)+ (?# e.g. A. or b.)
     (.+)          (?# the alphanumeric content with common symbols)
     ^(?:\1)       (?# e.g. 'not A.' or 'not b.')
     ''')

m = reg.findall(s)

例を挙げましょう。次の文字列があるとします。

s = '''
 a.   $1000 abcde!?
 b.  (December 31, 1993.)
 c.  8/1/2013
 d.   $690 * 10% = 69 Blah blah
'''

次の正規表現は機能し、正規表現グループの内容を返します。

reg = re.compile(r'''
            (?xi)
            \w\.\t*
            ([^\n]+) (?# anything not newline char)
''')

for c in reg.findall(s): print "line:", c
>>>line:    $1000 abcde!?
>>>line:  (December 31, 1993.)
>>>line:    8/1/2013
>>>line:   $690 * 10% = 69 Blah blah

しかし、内容が別の行ににじみ出た場合、正規表現は機能しません

s = '''
   a.   $1000 abcde!? B.     December 
   31, 1993 c.  8/1/2013 D.   $690 * 10% = 
   69 Blah blah
'''
reg = re.compile(r''' 
     (?xi)
     (\w\.\t*\s*)+ (?# e.g. A. or b.)
     (.+)          (?# the alphanumeric content with common symbols)
     ^(?:\1)       (?# e.g. 'not A.' or 'not b.')
     ''')
for c in reg.findall(s): print "line:", c # no matches :(
>>> blank :(

コンテンツを区切る改行があるかどうかに関係なく、同じ一致を取得したいと思います。

というわけで、否定一致語群を使ってみました。では、正規表現またはその他の回避策を使用してこの問題を解決する方法についてのアイデアはありますか?

ありがとう。

ポール

4

1 に答える 1

1

私は あなたが何を望んでいるのか理解していると思います分割したい

a.   $1000 abcde!? B.     December 
31, 1993 c.  8/1/2013 D.   $690 * 10% = 
69 Blah blah

の中へ

  • a. $1000 abcde!?
  • B. December \n31, 1993
  • c. 8/1/2013
  • D. $690 * 10% = \n69 Blah blah

右?次に、否定的な先読みアサーションが必要です。

reg = re.compile(r''' 
     (?xs)               # no need for i, but for s (dot matches newlines)
     (\b\w\.\s*)         # e.g. A. or b. (word boundary to restrict to 1 letter)
     ((?:(?!\b\w\.).)+)  # everything until the next A. or b.
     ''')

で使用しfindall()ます:

>>> reg.findall(s)
[('a.   ', '$1000 abcde!? '), ('B.     ', 'December \n   31, 1993 '), 
 ('c.  ', '8/1/2013 '), ('D.   ', '$690 * 10% = \n   69 Blah blah\n')]

a.パーツが不要な場合は、

reg = re.compile(r''' 
     (?xs)               # no need for i, but for s (dot matches newlines)
     (?:\b\w\.\s*)       # e.g. A. or b. (word boundary to restrict to 1 letter)
     ((?:(?!\b\w\.).)+)  # everything until the next A. or b.
     ''')
于 2013-03-04T20:58:44.093 に答える