如何使用正则表达式python定位XX st/nd/rd/th

如何使用正则表达式python定位XX st/nd/rd/th,python,regex,Python,Regex,我试图在字符串中查找一个或多个日期。我觉得这应该是非常简单的,我只是错过了一些东西,但不幸的是,我没有那么有经验的正则表达式 我的正则表达式是: lookup = re.findall("[0123456789]+st|[0123456789]+nd|[0123456789]+rd|[0123456789]+th", userInput, re.IGNORECASE) for group in lookup: print(group) 第三、第五、第二十一组的输出最好分别为第三、第五、第

我试图在字符串中查找一个或多个日期。我觉得这应该是非常简单的,我只是错过了一些东西,但不幸的是,我没有那么有经验的正则表达式

我的正则表达式是:

lookup = re.findall("[0123456789]+st|[0123456789]+nd|[0123456789]+rd|[0123456789]+th", userInput, re.IGNORECASE)
for group in lookup:
   print(group)
第三、第五、第二十一组的输出最好分别为第三、第五、第二十一组。然而,如果我不在每个st,nd,rd,th前面加上[0123456789],它最终只会与21这样的东西正确匹配,因为它认为[]只是第一个选项的一部分


有没有更简单更好的方法来说明这一点?

您需要对后缀进行分组:

lookup = re.findall("[0-9]+(?:st|[nr]d|th)", userInput, flags=re.IGNORECASE)

注意:如果要使用re.findall获得正确的输出,则需要使用非捕获组,?:。此外,为了以防万一,如果只想匹配整个单词,请在模式周围添加单词边界,r\b[0-9]+?:st|[nr]d|th\b

见:


对,奏效了。你链接的演示非常清晰。当我可以的时候,我会接受这个答案,因为我还不能lol谢谢你!
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']