【问题标题】:How can I match a text with colon using regex?如何使用正则表达式匹配带有冒号的文本?
【发布时间】:2020-09-25 21:53:02
【问题描述】:

我想使用正则表达式匹配名称前面或后面只有 1 个冒号的任何大小写,而不是两个冒号之间的名称。

匹配这样的东西:

name: | :name | name:`asdf`

但不应匹配以下任何一个:

:name: 
eman: 
nnamee: 
:nameasdfj

我有一个正则表达式,我认为它涵盖了前三个的所有情况,但它也匹配 :name: 我不想要的:

((?:^|\W)name:(?:$|\W))|((?:^|\W):name(?:$|\W))

【问题讨论】:

  • 你打算怎么处理这场比赛?替换/提取/删除/计数?那么,name 是否总是一个固定的字符串?如果是,试试(?<!\w):?name(?!\w)(?!(?<=:name):),见demo。
  • 按照您的规则,:nameasdfj 不应该匹配吗?假设它应该,并且您只想匹配 "name" 的有效实例,您可以使用正则表达式 r':name(?!:)|(?<!:)name:'、(?!:) 作为 negative lookahead 和 (?<!:) 作为 negative lookbehind 。 Demo

标签: python regex python-2.7 match colon


【解决方案1】:

试试(?<!\S)name:|:name(?!\S)

demo

或轻微的边界使用(?<![a-z:])name:|:name(?![a-z:])

demo2


使用第二个正则表达式的代码示例

>>> import re
>>> regex = r'(?<![a-z:])name:|:name(?![a-z:])'
>>> content = 'asdf- name:'
>>> re.search(regex, content).group(0)
'name:'

【讨论】:

  • 您的正则表达式实际上可以缩短为(?&lt;!\S)name:|:name(?!\S),因为: 是一个非空白字符。
  • 是的 : 永远不会是 wsp
  • 为什么这可能适用于 regex101 但不适用于我的实际 python 脚本?在我的python脚本中,我有正则表达式: r'(?
  • re.search 返回一个匹配对象,使用group(0) 成员获得一些结果。添加了代码示例。
  • 如果您觉得这个答案有用,请点赞@user1094771。
猜你喜欢
  • 2011-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-11
  • 1970-01-01
  • 1970-01-01
  • 2015-02-19
相关资源
最近更新 更多