尝试创建正则表达式,该表达式在一个长字符串中找到关键字,并且当关键字未被字母包围时。如果字符串被短划线或下划线包围,只要它不是由字母环绕。只需要找到一个单词的出现,就要考虑匹配。只关心在一个长串中找到它。目前,当单词旁边有一个'_'时,我无法使其成为True。任何更好表达的想法?
编辑 - 我发现了一个案例,我需要它是真的,并没有将它添加到示例中。
import re
key_words = ['go', 'at', 'why', 'stop' ]
false_match = ['going_get_that', 'that_is_wstop', 'whysper','stoping_tat' ]
positive_match = ['go-around', 'go_at_going','stop-by_the_store', 'stop','something-stop', 'something_stop']
pattern = r"\b(%s)\b" % '|'.join(key_words)
for word in false_match + positive_match:
if re.match(pattern,word):
print True, word
else:
print False, word
当前输出:
False going_get_that
False that_is_wstop
False whysper
False stoping_tat
True go-around
False go_at_going
True stop-by_the_store
True stop
编辑 - 这必须是真的
False something-stop
False something_stop
期望的输出:
False going_get_that
False that_is_wstop
False whysper
False stoping_tat
True go-around
True go_at_going
True stop-by_the_store
True stop
True something-stop
True something_stop
答案 0 :(得分:1)
使用否定外观(前面|后面)s:
import re
key_words = ['go', 'at', 'why', 'stop' ]
false_match = ['going_get_that', 'that_is_wstop', 'whysper','stoping_tat' ]
positive_match = ['go-around', 'go_at_going','stop-by_the_store', 'stop', 'something-stop', 'something_stop']
pattern = r"(?<![a-zA-Z])(%s)(?![a-zA-Z])" % '|'.join(key_words)
for word in false_match + positive_match:
if re.search(pattern,word):
print True, word
else:
print False, word
答案 1 :(得分:0)
您的模式很接近,您可以使用以下模式:
pattern = r"\b([a-zA-Z]+[-_])?(%s)([-_][a-zA-Z_-]+)?\b" % '|'.join(key_words)
答案 2 :(得分:0)
\b
的问题是它认为_
是\w
的一部分。所以它不是一个单词边界。否定这个效果会使你自己的角色类。
(?:^|(?<=[^a-zA-Z0-9]))(go|at|why|stop)(?=[^a-zA-Z0-9]|$)
试试这个。看看演示。
https://regex101.com/r/oC3qA3/8
import re
key_words = ['go', 'at', 'why', 'stop' ]
false_match = ['going_get_that', 'that_is_wstop', 'whysper','stoping_tat' ]
positive_match = ['go-around', 'go_at_going','stop-by_the_store', 'stop']
pattern = r"(?:^|(?<=[^a-zA-Z0-9]))(%s)(?=[^a-zA-Z0-9]|$)" % '|'.join(key_words)
for word in false_match + positive_match:
if re.findall(pattern,word):
print True, word
else:
print False, word
输出:False going_get_that
False that_is_wstop
False whysper
False stoping_tat
True go-around
True go_at_going
True stop-by_the_store
True stop