【问题标题】:Optional match for beginning of line行首的可选匹配
【发布时间】:2012-09-27 05:10:39
【问题描述】:

我正在尝试在 Python 中创建一个匹配 #hashtags 的正则表达式。我对主题标签的定义是:

  • 这是一个以#开头的作品
  • 可以包含除[ ,\.]以外的所有字符
  • 可以在文本中的任何位置

所以在本文中

#This string cont#ains #four, and #only four #hashtags.

这里的哈希值是Thisfouronlyhashtags

我遇到的问题是对行首的可选检查。

  • [ \.,]+ 不会这样做,因为它与可选的开头不匹配。
  • [ \.,]? 不会这样做,因为它匹配的太多。

带 + 的示例

In []: re.findall('[ \.,]+#([^ \.,]+)', '#This string cont#ains #four, and #only four #hashtags.')
Out[]: ['four', 'only', 'hashtags']

示例 ?

In []: re.findall('[ \.,]?#([^ \.,]+)', '#This string cont#ains #four, and #only four #hashtags.')
Out[]: ['This', 'ains', 'four', 'only', 'hashtags']

可选如何匹配行首?

【问题讨论】:

    标签: python regex hashtag


    【解决方案1】:

    这似乎有效:

    >>> re.findall(r'\B#([^,\W]+)', '#This string cont#ains #four, and #only four #hashtags.')
    ['This', 'four', 'only', 'hashtags']
    
    • \B:匹配空字符串,但仅当它不在单词的开头或结尾时。这意味着r'py\B' 匹配'python''py3''py2',但不匹配'py''py.''py!'\B\b正好相反,所以也受LOCALEUNICODE的设置。
    • \W:当LOCALEUNICODE标志未指定时,匹配任何非字母数字字符;这相当于集合[^a-zA-Z0-9_]。使用 LOCALE,它将匹配不在集合 [0-9_] 中的任何字符,并且未定义为当前语言环境的字母数字。如果设置了UNICODE,则这将匹配除[0-9_] 外的任何字符以及Unicode 字符属性数据库中分类为非字母数字的字符。

    【讨论】:

    • 感谢您快速正确的回复!像魅力一样工作
    【解决方案2】:

    在你的正则表达式之前,你可以告诉你不想要什么。

    (?<!\w)(#[^ \.,]+)
    

    通过消极的向后看,你可以做到这一点

    【讨论】:

    • 这与字符串开头的“#This”不匹配。
    猜你喜欢
    • 1970-01-01
    • 2022-10-05
    • 2016-04-24
    • 1970-01-01
    • 2020-12-28
    • 2013-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多