假设我们不需要打扰大写或小写,所以我使用了re.IGNORECASE。
我使用正则表达式来解决这个问题。这就是我解决的问题:
total = 0
for line in alllines:
count = 0
count = len(re.findall(word, line, re.IGNORECASE))
total += count
但我遇到了一个我想知道的新问题。如果我只想要完整的单词怎么办?例如,如果该行包含'helloworld',那么如果我的术语是'hello',则不应计算它。但我的方式将计算它。有什么建议吗?
答案 0 :(得分:3)
要匹配完整的单词,您需要使用单词边界。
count = len(re.findall(r'\b'+ word + r'\b', line, re.IGNORECASE))
但这会匹配hello
中的foo:hello:bar
。如果您不想要这种类型的匹配,那么您可以使用外观断言来匹配完整的完整单词。
count = len(re.findall(r'(?<!\S)'+ word + r'(?!\S)', line, re.IGNORECASE))
如果你想传递的word
正则表达式包含specail chars,那么你需要在该单词上使用re.escape
函数,然后才能在正则表达式中使用它。
count = len(re.findall(r'(?<!\S)'+ re.escape(word) + r'(?!\S)', line, re.IGNORECASE))
(?<!\S)
称为负向lookbehind,它断言匹配不会以非空格字符开头。为什么我们在这里使用断言意味着它不匹配任何字符,但它断言匹配是否可能。 (?!\S)
称为负向前瞻,它断言匹配不会跟随非空格字符。也就是说,除了非空格字符之外,任何事物都在匹配之后。