1

非常に大きな文字列内の文字列とそのバリエーションのリストを探しています。

私がやりたいことは、2 つの文字列間の暗黙的な一致さえも見つけることです。

たとえば、開始文字列が の場合foo-bar、マッチングでFoo-bAr foo Barまたは. もちろん、一致も返す必要があります。 foo(bar...foo-bar


編集:より具体的には、次の一致が必要です。

  1. 大文字と小文字を区別しない文字列自体。
  2. 文字を区切るスペースを含む文字列
  3. 文字を括弧で区切った文字列。

これらの条件を満たす式をどのように記述すればよいでしょうか?

これにはトリッキーな正規表現が必要になる可能性があることを認識しています。問題は、検索する必要がある文字列のリストが大量にあるということです。正規表現は、これを必要なだけ堅牢にするためのツールにすぎないと感じています。

おそらく正規表現は最善の解決策ではないでしょうか?

助けてくれてありがとう。私はまだ正規表現で考えることを学んでいます。

4

4 に答える 4

2
>>> def findString(inputStr, targetStr):
...     if convertToStringSoup(targetStr).find(convertToStringSoup(inputStr)) != -1:
...             return True
...     return False
... 
>>> def convertToStringSoup(testStr):
...     testStr = testStr.lower()
...     testStr = testStr.replace(" ", "")
...     testStr = testStr.replace("(", "")
...     testStr = testStr.replace(")", "")
...     return testStr
... 
>>> 
>>> findString("hello", "hello")
True
>>> findString("hello", "hello1")
True
>>> findString("hello", "hell!o1")
False
>>> findString("hello", "hell( o)1")
True

仕様に従って動作するはずです。明らかに、最適化できます。あなたは私が一生懸命考えている正規表現について尋ねています。うまくいけば、この質問を何か良いものですぐに編集できます。ただし、これが遅すぎない場合、正規表現は惨めになる可能性があり、読みやすい方が良いことがよくあります!

同じ大きな干し草の山を繰り返し見ていることに気づきました。明らかに、それを「ストリング スープ」に変換する必要があるのは 1 回だけです。

編集:私は正規表現について考えてきましたが、あなたが行う正規表現には多くの句が必要であるか、この回答で行ったようにテキストを正規表現前に変更する必要があります。string.find() と re.find() のベンチマークは行っていませんが、この場合は前者の方が速いと思います。

于 2013-08-05T23:20:11.497 に答える
2

主に、一連の質問の後に明確化として後でルールを追加したため、ルールは正しく、例は間違っていると想定します。そう:

編集:より具体的には、次の一致が必要です。

  1. 大文字と小文字を区別しない文字列自体。
  2. 文字を区切るスペースを含む文字列
  3. 文字を括弧で区切った文字列。

これを行う最も簡単な方法は、スペースと括弧を削除してから、結果に対して大文字と小文字を区別しない検索を行うことです。そのための正規表現も必要ありません。例えば:

haystack.replace(' ', '').replace('(', '').upper().find(needle.upper())
于 2013-08-05T23:20:25.763 に答える
0

正規表現を使用すると、大文字と小文字を区別しない検索で大文字と小文字の不変条件が一致し、「[]」は含まれるすべての文字と一致し、「|」は「|」と一致します。一度に複数の比較を行うことができます。すべてをまとめると、次のことを試すことができます。

import re
pairs = ['foo-bar', 'jane-doe']
regex = '|'.join(r'%s[ -\)]%s' % tuple(p.split('-')) for p in pairs)
print regex
results = re.findall(regex, your_text_here, re.IGNORECASE)
于 2013-08-05T23:20:38.937 に答える
0

この正規表現を試してください:

[fF][oO]{2}[- ()][bB][aA][rR]

テスト:

>>> import re
>>> pattern = re.compile("[fF][oO]{2}[- ()][bB][aA][rR]")
>>> m = pattern.match("foo-bar")
>>> m.group(0)
'foo-bar'
于 2013-08-05T23:06:15.740 に答える