正则表达式:计算完全匹配的数量

时间:2017-10-31 10:10:19

标签: python regex

我试图找出德国工作名称的变体出现在给定字符串中的次数。假设作业名称为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链接

1 个答案:

答案 0 :(得分:1)

您可以使用明确的单词边界:

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

请参阅regex demo

如果搜索词前面有单词char,(?<!\w)将失败,如果搜索词后面有单词char,则(?!\w)将失败。