我正在尝试在字符串中查找一个(或多个)日期。我觉得这应该非常简单,我只是遗漏了一些东西,但不幸的是我对正则表达式没有那么丰富的经验。
我的正则表达式是:
lookup = re.findall("[0123456789]+st|[0123456789]+nd|[0123456789]+rd|[0123456789]+th", userInput, re.IGNORECASE)
for group in lookup:
print(group)
“3rd、5th、21st”的输出理想情况下是单独组中的 3rd、5th、21st。但是,如果我不把 [0123456789] 放在 EACH st、nd、rd、th 之前,它最终只会与 21st 之类的东西正确匹配(因为它认为 [] 只是第一个 | 选项的一部分)
有没有更简单更好的方法来设置它?
请您参考如下方法:
您需要对后缀进行分组:
lookup = re.findall("[0-9]+(?:st|[nr]d|th)", userInput, flags=re.IGNORECASE)
参见 regex demo
请注意,如果您想使用 re.findall 获得正确的输出,则需要使用非捕获组 (?:...)。此外,以防万一,如果您只想匹配整个“单词”,请在模式周围添加 \b 单词边界,r"\b[0-9]+(?:st |[nr]d|th)\b".
参见 Python demo :
import re
rx = r"[0-9]+(?:st|[nr]d|th)"
s = "April, 23rd June 1st May 2nd"
print(re.findall(rx, s, flags=re.I))
# => ['23rd', '1st', '2nd']
