1

文字列を正規表現と一致させようとしていますが、2 つのケースのうちの 1 つのみが機能しています

ABCD 123 - Abcdef 0000
ABCD 123/DEFG123 - Abcdef 0000

正規表現

[A-Z]+ [A-Z0-9]{2,20} - [A-Z][a-z]+ [0-9]{4}

これは最初のものと一致し、両方に一致させようとしています。これは私が試した新しい表現です

[A-Z]+ [A-Z0-9\\/]{2,20} - [A-Z][a-z]+ [0-9]{4}

DEFG123 - Abcdef 0000これは全体に一致しますABCD 123/DEFG123 - Abcdef 0000が、これから文字列全体を取得しようとしています。これは私が使用しているコードです

regex = re.compile(expression)
r = regex.search(string)
4

4 に答える 4

0

スラッシュをエスケープする必要はないと確信しています。ダブルを削除する\と、設定する必要があります。この種のことをテストするには、regexpal.com を使用します。

于 2012-07-25T19:23:28.090 に答える
0

余分なバックスラッシュを削除します:

[A-Z]+ [A-Z0-9\/]{2,20} - [A-Z][a-z]+ [0-9]{4}

または、グループ化を使用できます。

([A-Z]+ [A-Z0-9]{2,20} - [A-Z][a-z]+ [0-9]{4})|([A-Z]+ [A-Z0-9\\/]{2,20} - [A-Z][a-z]+ [0-9]{4})

これは、上記の両方の RegEx を組み合わせて、両方の行に一致します。

于 2012-07-25T19:23:28.777 に答える
0

私はこのコードを試しました:

import re
def foo(s):
    r = re.compile('[A-Z]+ [A-Z0-9\\/]{2,20} - [A-Z][a-z]+ [0-9]{4}')
    m = r.search(s)
    return s[m.start():m.end()]
print foo('ABCD 123 - Abcdef 0000')
print foo('ABCD 123/DEFG123 - Abcdef 0000')

そして次の結果を得ました:

ABCD 123 - Abcdef 0000
ABCD 123/DEFG123 - Abcdef 0000

^(行頭) と$(行末) 文字を使用してみてください:

r = re.compile('^[A-Z]+ [A-Z0-9\\/]{2,20} - [A-Z][a-z]+ [0-9]{4}$')
于 2012-07-25T19:25:18.060 に答える
0

何が悪いのかというと、逃げることです。取り出した:

string_one = 'ABCD 123 - Abcdef 0000'
string_two = 'ABCD 123/DEFG123 - Abcdef 0000'
pattern = r'[A-Z]+ [A-Z0-9/]{2,20} - [A-Z][a-z]+ [0-9]{4}'
regex = re.compile(pattern)
if regex.search(string_one):
    print "string one matches!"
if regex.search(string_two):
    print "string two matches!"

# output:
string one matches!
string two matches!

生の文字列 ( r'this is a raw string') を不必要に使用していることに注意してください。

于 2012-07-25T19:25:41.507 に答える