2017-10-31 26 views
0

ドイツ語のジョブ名の変種が指定された文字列に何回現れるかを調べようとしています。ジョブ名がSchneider(テーラー)であるとします。ジョブ名自体を含むバリアント(ジョブ名の男性と女性の形を示す)は、次のとおりです。各バリアントは無視して、個別にRegexes:完全一致の数をカウント

Schneider Schneiderin Schneider/in Schneider/-in Schneider (m/w) 

カウントする必要があります:

Schneider 
Schneiderin 
Schneider/in 
Schneider/-in 
Schneider (m/w) 

だから私は、次の文字列をしていると仮定バリアント間のオーバーラップだから、私は各バリアントを通過し、上記の文字列内の出現回数を数える場合、結果は常に1になるはずです。

私は単語の境界を使用して正規表現でこれを解決しようとしました。私は次のパターンを使用しました:

\b{}\b(?![\/]|(\s\(m\/w\))) 

{}はバリアントに置き換えられます。

ご覧のとおり、正規表現は単語の境界を使用して、完全な単語の一致のみが見つかるようにします。さらに、フォワードルックアヘッドを使用してスラッシュを除外し、(m/w)をワード境界として扱わないようにします。

パターンは、文字列に見つからない最後のパターン(Schneider (m/w))を除いてうまく機能します。あなたはここにこの動作を確認することができます:https://regex101.com/r/FTqvIO/4

完全を期すために、ここでのPythonの私の現在の実装です:

import re 
def count_variant(variant, string): 
    pattern = re.compile(r'\b%s\b(?![\/]|(\s\(m\/w\)))' % variant) 
    matches = re.findall(pattern, string) 
    return len(matches) 

正規表現上の任意のヘルプ(またはより簡単なアプローチが利用可能な場合)大歓迎です!

編集は:

r'(?<!\w){}(?![\w/]|\s\(m/w\))'.format(re.escape(word)) 

regex demo

単語がある場合(?<!\w)は試合を失敗するを参照してください:あなたは明確な単語の境界を使用することができRegex101

答えて

1

への正しいリンクを挿入検索語の前にcharがあり、(?!\w)の場合は、検索語の後にwordという文字があれば一致しません。

+0

おい、あなたロック! – tiefenauer