如何找到所有与正则表达式匹配的单词?

时间:2019-03-05 20:53:07

标签: python regex

这可能以前曾被问过,但是,我找不到解决方案。假设我的文字是'C:\\Windows\\system32\\cmd.exe /v /c hello cmd.exe',我想查找并删除所有带有正则表达式r'cmd.exe'的单词。结果必须为:'/v /c hello'

这是我尝试的方法:首先,我试图找到单词边界的索引,以便可以删除它们。但是,我得到的索引是针对确切的正则表达式的,而不是针对整个匹配的单词。

In [41]: [(m.start(0), m.end(0)) for m in re.finditer(r'\b\w*cmd.exe\w*\b', cmd)]
Out[41]: [(20, 27), (40, 47)]

In [42]: [(m.start(0), m.end(0)) for m in re.finditer(r'cmd.exe', cmd)]
Out[42]: [(20, 27), (40, 47)]

In [44]: result = re.findall(r'cmd.exe', cmd, re.I)

In [45]: result
Out[45]: ['cmd.exe', 'cmd.exe']. <-- I wanted ['C:\\Windows\\system32\\cmd.exe', 'cmd.exe']

In [48]: result = re.findall(r'cmd.exe|\bcmd.exe\b', cmd, re.I)

In [49]: result
Out[49]: ['cmd.exe', 'cmd.exe']

简而言之,如何获得包含子字符串/正则表达式的整个单词?

2 个答案:

答案 0 :(得分:2)

不是说正则表达式不好*,而是为什么不简单:

txt = 'C:\\Windows\\system32\\cmd.exe /v /c hello cmd.exe'
outcome = ' '.join([part for part in txt.split(' ') if not 'cmd.exe' in part])

给出:

'/v /c hello'

* 有些人遇到问题时会认为“我知道,我会使用正则表达式”。现在他们有两个问题。

答案 1 :(得分:1)

您可以使用此正则表达式:

>>> s = r'C:\\Windows\\system32\\cmd.exe /v /c hello cmd.exe'
>>> print (re.sub(r'\S*cmd\.exe\S*\s*', '', s))
/v /c hello

RegEx详细信息:

  • '\S*:匹配0个或更多非空格字符
  • cmd\.exe:匹配cmd.exe
  • \S*:匹配0个或更多非空格字符
  • \s*:匹配0个或更多空白字符