Python中的正则表达式匹配,以提取所有主题标签及其相邻的标点符号?

时间:2017-12-09 17:45:07

标签: regex python-3.x

我想提取与其他主题标签/标点符号相邻的所有主题标签,以便我可以从中获取bigrams。对于以下变量c,我想提取['! #helloworld #goodday #winter #christmastime !']

的输出
c = 'Hello!! This is a good day! #helloworld #goodday #winter #christmastime!'
re.findall(r'(?:#[a-zA-Z]+ #[a-zA-Z]+)|(?:[\!"#\$%&\'\(\)*+,-./\:;<=>\?\@\[\\]\^_`{|}~]+ #[a-zA-Z]+)',b)

实际输出: [&#39; #helloworld#goodday&#39;,&#39; #winter#christmastime&#39;]

预期输出 [&#39 ;! #helloworld #goodday #winter #christmastime!&#39;]

应该使用哪个正则表达式来提取字符串的预期输出?

1 个答案:

答案 0 :(得分:1)

您可以使用

[^\w\s](?:\s*#[a-zA-Z]+)+(?:\s*[^\w\s])?

请参阅regex demo。如果始终至少有1个空格,请将\s*替换为\s+

<强>详情

  • [^\w\s] - 标点符号(除了单词和空白字符之外的任何1个字符)
  • (?:\s*#[a-zA-Z]+)+ - non-capturing group个匹配的1个或多个序列:
    • \s* - 0+ whitespaces
    • # - #符号
    • [a-zA-Z]+ - 1+ ASCII字母
  • (?:\s*[^\w\s])? - 可选序列:
    • \s* - 0+ whitespaces
    • [^\w\s] - 标点符号(除了单词和空白字符之外的任何1个字符)

Python demo

import re
c = 'Hello!! This is a good day! #helloworld #goodday #winter #christmastime!'
print(re.findall(r'[^\w\s](?:\s*#[a-zA-Z]+)+(?:\s*[^\w\s])?',c))
# => ['! #helloworld #goodday #winter #christmastime!']