找到关键字符之间的单词模式

时间:2015-03-15 14:02:37

标签: python regex

尝试创建正则表达式,该表达式在一个长字符串中找到关键字,并且当关键字未被字母包围时。如果字符串被短划线或下划线包围,只要它不是由字母环绕。只需要找到一个单词的出现,就要考虑匹配。只关心在一个长串中找到它。目前,当单词旁边有一个'_'时,我无法使其成为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

3 个答案:

答案 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)

Regular expression visualization

Debuggex Demo

答案 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