如何在没有捕获空间的情况下捕捉周围空间的单词?

时间:2018-03-13 08:20:25

标签: python regex

我有一个像这样的字符串s = "Hello this is Helloworld #helloworld #hiworld #nihaoworld "这个想法是捕获所有的标签,但是标签需要有一个边界。例如如果不会捕获"Hello this is helloworld#helloworld"之类的内容。

我想生成以下结果["#helloworld","#hiworld","nihaoworld"] 我有以下python代码

import re
print re.findall('(?:^|\s+)(#[a-z]{1,})(?:\s+|$)', s)

我得到的结果是["#helloworld","#nihaoworld"],缺少中间词

1 个答案:

答案 0 :(得分:1)

我认为你真的不需要正则表达式,你可以使用:

s.strip().split()

但是,如果您确实想要使用正则表达式,则可以使用(?:^|\s)(#\w+)

>>> import re
>>> s = " #helloworld #hiworld #nihaoworld "
>>> re.findall(r'(?:^|\s)(#\w+)', s)
['#helloworld', '#hiworld', '#nihaoworld']

<强>解释

  • 非捕获组(?:^|\s)
    • 第一替代^
      • ^在字符串
      • 的开头断言位置
    • 第二个替代\s
      • \s匹配任何空格字符(等于[\r\n\t\f\v ]
  • 第一捕获小组(#\w+)
    • #字面匹配字符#(区分大小写)
    • \w+匹配任何字词(等于[a-zA-Z0-9_]
    • +量词 - 在一次和无限次之间匹配,尽可能多次,根据需要回馈(贪婪)