我试图找出德国工作名称的变体出现在给定字符串中的次数。假设作业名称为Schneider
(裁缝)。变体(表示作业名称的男性和女性形式)包括作业名称本身是:
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)
非常感谢任何有关正则表达式的帮助(或更简单的方法)!
修改:插入正确的Regex101链接
答案 0 :(得分:1)
您可以使用明确的单词边界:
r'(?<!\w){}(?![\w/]|\s\(m/w\))'.format(re.escape(word))
请参阅regex demo
如果搜索词前面有单词char,(?<!\w)
将失败,如果搜索词后面有单词char,则(?!\w)
将失败。