【问题标题】:regular expression: the outcome is not as expected [duplicate]正则表达式:结果不符合预期[重复]
【发布时间】:2020-05-21 21:15:10
【问题描述】:
import re
pattern = "[0-9]+[st|nd|rd|th]?"
str2 = "1st 1 2 3 4 5th "
a = re.findall(pattern, str2)
print(a)

预期输出

['1st', '1', '2', '3', '4', '5th']

实际输出

['1s', '1', '2', '3', '4', '5t']

【问题讨论】:

  • 尝试用圆括号替换方括号。 regex101.com/r/aRhIp4/1
  • @user8408080,非常感谢! [st|nd|rd|th] 真的要求正则表达式匹配 s, t|n, d|r,d|t,h。

标签: python regex


【解决方案1】:
import re
pattern = r'[0-9]+(?:st|nd|rd|th)?'
str2 = "1st 1 2 3 4 5th "
a = re.findall(pattern, str2)
print(a)

输出: ['1st', '1', '2', '3', '4', '5th']

您的错误是使用方括号而不是括号。方括号通常用于表示一个范围(如 0-9),而不是“或”,这是您在后缀中想要的。进一步阅读: What is the difference between square brackets and parentheses in a regex?

如果只更改括号,输出将如下:

[('1', 'st'), ('1', ''), ('2', ''), ('3', ''), ('4', ''), ('5', 'th')]

这仍然不是您想要的,因此我们对模式进行了第二次更改:添加 ?: 是创建非捕获组的语法(意味着“将其视为一个组”)。

【讨论】:

  • "[0-9]+(?:st|nd|rd|th)?"请使用这个表达式来省去合并元组的麻烦:)
  • @PythonNewbie 你说得对。我正在编辑我的帖子
猜你喜欢
  • 1970-01-01
  • 2018-06-04
  • 1970-01-01
  • 1970-01-01
  • 2014-12-21
  • 2014-04-04
  • 2022-11-02
  • 1970-01-01
  • 2015-12-06
相关资源
最近更新 更多