这可能以前曾被问过,但是,我找不到解决方案。假设我的文字是'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']
简而言之,如何获得包含子字符串/正则表达式的整个单词?
答案 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个或更多空白字符