正则表达式re.findall找到两边都有空格的子串

时间:2016-06-16 18:11:15

标签: python regex findall

我正在尝试在我的文本列上使用re.findall来查找以下任何一侧的空格,因为那是唯一重要的。我正在使用以下脚本

url = '#MnA deals for 2015 across all #oilandgas sectors were lower than WAR WARduring the CFO Great CIO Recession' 

regex=re.findall(r'WAR|CIO|CISO|CTO|C-Suite|CMO|CFO|Founder+',url)  
print regex 
['WAR', 'WAR', 'CFO', 'CIO']

而不是这个我只想要

['WAR', 'CFO', 'CIO']

自从第二次不仅仅是WAR,它的WARduring,我不想要那个

还有什么操作员可以在下标前面看到我想看的所有内容,比如

['WAR', 'WARduring','CFO', 'CIO']

感谢每一个帮助

3 个答案:

答案 0 :(得分:2)

您可以使用前瞻:

>>> re.findall(r'\b(?:WAR|CIO|CISO|CTO|C-Suite|CMO|CFO|Founder+)(?=\s|$)', url)
['WAR', 'CFO', 'CIO']

(?=\s|$)会在您的关键字后声明存在空格或行尾。

对于第二项任务,请使用此正则表达式:

>>> re.findall(r'\b((?:WAR|CIO|CISO|CTO|C-Suite|CMO|CFO|Founder+)\w*)', url)
['WAR', 'WARduring', 'CFO', 'CIO']

在您的关键字匹配0个或更多单词字符后,\w*

答案 1 :(得分:2)

在正则表达式中使用单词边界 [Know more]将解决您的问题

正则表达式

\b(?:WAR|CIO|CISO|CTO|C-Suite|CMO|CFO|Founder+)\b

代码

url = '#MnA deals for 2015 across all #oilandgas sectors were lower than WAR WARduring the CFO Great CIO Recession' 

regex=re.findall(r'\b(WAR|CIO|CISO|CTO|C-Suite|CMO|CFO|Founder+)\b',url)  
print regex 
['WAR', 'CFO', 'CIO']

答案 2 :(得分:2)

方法1:错误地将WAR检测为WAR

另一种方法:使用\ b来分隔单词

regex=re.findall(r'\b(WAR|CIO|CISO|CTO|C-Suite|CMO|CFO|Founder)\b',url)


url = '#MnA deals for 2015 across all #oilandgas theWAR sectors were lower than WAR WARduring the CFO Great CIO'

regex=re.findall(r'(WAR|CIO|CISO|CTO|C-Suite|CMO|CFO|Founder+)(?=\s|$)', url)  # bug with start of word
print regex
regex=re.findall(r'\b(WAR|CIO|CISO|CTO|C-Suite|CMO|CFO|Founder)\b',url)
print regex
['WAR', 'WAR', 'CFO', 'CIO']
['WAR', 'CFO', 'CIO']