【问题标题】:Ignore specific caracter in a python regex match忽略 python 正则表达式匹配中的特定字符
【发布时间】:2020-07-06 17:28:29
【问题描述】:

我一直在尝试从如下字符串中提取一些值: '5 块钱',也可以得到'5 块钱',但是当它单独出现时忽略这个词,前面没有任何数字。我一直在尝试使用这个正则表达式:

(\d*)(?:\s?)(?=bucks|dollars)

并在https://regex101.com/ 上进行测试。它给了我两个匹配而不是一个,使用相同的字符串。这是为什么?这就是我得到的:

第 1 场比赛:

完全匹配:5

第 1 组:5

第 2 场比赛:

完全匹配:

第一组:

在第二场比赛中,它似乎都是空的。有没有办法阻止我的正则表达式找到这些 len 0 匹配项?或者有什么办法可以治疗?

【问题讨论】:

  • 您只想匹配数字吗?还是数字和钱加在一起?
  • 数字和金钱在一起
  • 您可以使用\b\d+ ?(?:bucks|dollars)\b 来同时获取它们regex101.com/r/sMwa3y/1 前瞻(?= 是一个非消耗性断言。
  • @FelipeHonorato - 您的链接没有任何代码。
  • 哥们,你已经完全解决了我的问题。谢谢你。将其发布为答案,以便我可以关闭此主题@Thefourthbird

标签: python regex


【解决方案1】:

您得到这些匹配项是因为您匹配可选数字 \d* 和可选空格字符 \s?,其中正面的前瞻性断言它是正确的美元或美元在右侧。

要获得这两种变体,您可以将| 与非捕获组一起使用。为了防止单词成为更大单词的一部分,您可以添加单词边界\b

\b\d+ ?(?:bucks|dollars)\b

Regex demo

【讨论】:

    【解决方案2】:
    '(\d+)\s*(bucks|dollars)?'
    

    然后选择第一个匹配的项目。

    【讨论】:

    • 嗯,但是这样我不能在数字和单词之间有退格,我也可以在那里放任何仍然匹配的单词
    • @FelipeHonorato - 这是一个非常不正常的请求。 “退格”通常在文本输入期间以非常低的级别处理。它的生存时间不够长,无法出现在数据库中。
    • @FelipeHonorato - 正则表达式中的\b 不是“退格”;它是“单词边界”。
    • 是的,我知道。 \s 指的是那个,而不是 \b
    猜你喜欢
    • 2014-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-29
    • 1970-01-01
    • 1970-01-01
    • 2021-01-31
    • 2015-01-15
    相关资源
    最近更新 更多