5

私はこのようなものを持っています:

Othername California (2000) (T) (S) (ok) {state (#2.1)}

取得する正規表現コードはありますか:

Othername California ok 2.1

つまり、{} 内にある丸括弧内に数値を保持し、() 内にあるテキスト "ok" を保持したいと考えています。行に「ok」という文字列が含まれている場合は、特に出力する必要がありますが、(V)、(S)、(2002) などの括弧内の他のテキストを削除したいと考えています。

おそらく正規表現は、このような問題を処理する最も効率的な方法ではないことを認識しています。

どんな助けでも大歓迎です。

編集:

一部の情報が利用できない場合は行に含まれないため、文字列は異なる場合があります。また、テキスト自体は変更可能です (たとえば、すべての行に「状態」はありません)。したがって、たとえば次のようにすることができます。

Name1 Name2 Name3 (2000) (ok) {edu (#1.1)}
Name1 Name2 (2002) {edu (#1.1)}
Name1 Name2 Name3 (2000) (V) {variation (#4.12)}
4

4 に答える 4

8

正規表現

(.+)\s+\(\d+\).+?(?:\(([^)]{2,})\)\s+(?={))?\{.+\(#(\d+\.\d+)\)\}

正規表現イメージ

テストに使用するテキスト

Name1 Name2 Name3 (2000) {教育 (#3.2)}
Name1 Name2 Name3 (2000) (ok) {edu (#1.1)}
Name1 Name2 (2002) {edu (#1.1)}
Name1 Name2 Name3 (2000) (V) {variation (#4.12)}
別名カリフォルニア (2000) (T) (S) (ok) {state (#2.1)}

テスト

>>> 正規表現 = re.compile("(.+)\s+\(\d+\).+?(?:\(([^)]{2,})\)\s+(?={)) ?\{.+\(#(\d+\.\d+)\)\}")
>>> r = regex.search(文字列)
>>>r
<_sre.SRE_Match オブジェクト 0x54e2105f36c16a48>
>>> regex.match(文字列)
<_sre.SRE_Match オブジェクト 0x54e2105f36c169e8>

# findall を実行
>>> regex.findall(文字列)
[
   (u'Name1 Name2 Name3' , u'' , u'3.2'),
   (u'Name1 Name2 Name3' , u'ok', u'1.1'),
   (u'Name1 Name2' , u'' , u'1.1'),
   (u'Name1 Name2 Name3' , u'' , u'4.12'),
   (u'Othername California', u'ok', u'2.1')
]
于 2013-06-18T09:10:40.870 に答える
2

これを試してください:

import re

thestr = 'Othername California (2000) (T) (S) (ok) {state (#2.1)}'

regex = r'''
    ([^(]*)             # match anything but a (
    \                   # a space
    (?:                 # non capturing parentheses
        \([^(]*\)       # parentheses
        \               # a space
    ){3}                # three times
    \(([^(]*)\)         # capture fourth parentheses contents
    \                   # a space
    {                   # opening {
        [^}]*           # anything but }
        \(\#            # opening ( followed by #
            ([^)]*)     # match anything but )
        \)              # closing )
    }                   # closing }
'''

match = re.match(regex, thestr, re.X)

print match.groups()

出力:

('Othername California', 'ok', '2.1')

そして、ここに圧縮されたバージョンがあります:

import re

thestr = 'Othername California (2000) (T) (S) (ok) {state (#2.1)}'
regex = r'([^(]*) (?:\([^(]*\) ){3}\(([^(]*)\) {[^}]*\(\#([^)]*)\)}'
match = re.match(regex, thestr)

print match.groups()
于 2013-06-18T09:24:54.647 に答える