メモリ内に文字列のリストがあるとします (基本的に String1 - String100)
String1
String2
...
String11
String12
...
String20
String21
...
正規表現を使用して、次のことを実行できる 1 つの方法は何ですか?
'"String1" を含まないが、"String10" または "String3" を含むすべての文字列に一致する'
メモリ内に文字列のリストがあるとします (基本的に String1 - String100)
String1
String2
...
String11
String12
...
String20
String21
...
正規表現を使用して、次のことを実行できる 1 つの方法は何ですか?
'"String1" を含まないが、"String10" または "String3" を含むすべての文字列に一致する'
これには、先読みアサーションを使用できます。
^(?=.*String(?:10|3)\b)(?!.*String1\b)
これは、文字列に または のいずれString10
かString3
が含まれている場合に一致しますが、含まれていない場合にのみ一致しますString1
(これらの単語が空白やその他の英数字以外の文字などで区切られていると仮定します)。
一致自体は長さがゼロになるため、一致があるかどうかを確認するだけで済みます。
>>> strings = ["String10 String1 String5", "String4", "String10 String2",
... "String1 String3", "String4 String3"]
>>> regex = re.compile(r"^(?=.*String(?:10|3)\b)(?!.*String1\b)")
>>> [string for string in strings if regex.search(string)]
['String10 String2', 'String4 String3']
説明:
regex = re.compile(r"""
^ # Match the start of the string
(?= # Assert that the following can be matched here:
.* # Any string, followed by
String # the word "String" and
(?:10|3) # either the number 10 or 3.
\b # Make sure the word ends here (don't match "String100"!)
) # End of lookahead. We're still at the start of the string!
(?! # Assert that the following can't be matched here
.* # Any string, followed by
String1 # "String1"
\b # Make sure the word ends here (don't match "String10"!)
) # End of lookahead
""", re.VERBOSE)
そのために正規表現を使用する必要はありません。Python では、次のようなものを使用できます。
>>> string1 = 'bla'
>>> string2 = 'ble'
>>> string3 = 'blue'
>>>
>>> the_string = 'blabla'
>>> string1 in the_string and string2 not in the_string and string3 not in the_string
True