Python-反向引用命名组

Python-反向引用命名组,python,regex,backreference,capturing-group,Python,Regex,Backreference,Capturing Group,我很难理解如何在python中使用命名的反向引用。我想查找1月至3月的参考月份及其缩写形式(例如1月、1月、2月、2月等) 1962年1月20日,鲍勃·马丁带来了一辆汽车。2月23日,鲍勃卖掉了他的汽车。3月21日将会很有趣 关于findall(“”) (?P(一月(一月份);(二月(一月份);(三月)(三月份);)个月 |(?P=Month)\s\d{2}(rd|st) |[Tt]he\s\d{2}(rd|st)\sof(?P=Month) ''' str,re.X.) 应匹配: 一月 2月

我很难理解如何在python中使用命名的反向引用。我想查找1月至3月的参考月份及其缩写形式(例如1月、1月、2月、2月等)

1962年1月20日,鲍勃·马丁带来了一辆汽车。2月23日,鲍勃卖掉了他的汽车。3月21日将会很有趣 关于findall(“”) (?P(一月(一月份);(二月(一月份);(三月)(三月份);)个月 |(?P=Month)\s\d{2}(rd|st) |[Tt]he\s\d{2}(rd|st)\sof(?P=Month) ''' str,re.X.) 应匹配:

一月

2月23日


3月21日

从您的示例中,您似乎试图使用组作为一种快捷方式,以避免多次写出一段正则表达式。也就是说,您希望编写一个表达式,如
(?Pthis | That)| somethine(?p=expr)
,并让它像编写了
(this | That)| somethine(this | That)那样工作

但这不是组的工作方式。捕获组(包括命名组)捕获匹配的内容,而不是表达式本身。在您的示例中,如果输入文本不包含给定的月份名称之一,则“月份”“组将为空。如果它确实包含其中一个,那么组将包含月份名称,但您的模式不会使用它,因为您使用的是替代项,因此如果第一部分(正则表达式的第一行)匹配,它将不会尝试其他部分(第二行和第三行)

反向引用的目的是匹配输入字符串中多次出现的相同文本,而不是重复正则表达式本身的一部分。例如,类似于
(a | b)is\1的内容将匹配“a是a”或“b是b”,但不匹配“a是b”。因此,这个正则表达式与
(a | b)is(a | b)
不同,后者也会匹配“a是b”

不能使用反向引用预定义正则表达式的各个部分。如果要这样做,必须定义一个单独的字符串,并将其多次连接到模式中。例如,在我的示例中,您可以执行
letter=r”(a | b)
,然后执行
regex=letter+“is”+letter
,以获得
(a | b)is(a | b)


然而,这样做很快就会变得笨拙。正则表达式不是一个很好的工具,用于表示包含大量混合和可匹配部分的语法(如示例中的“月”)。为此,您最好使用像这样的解析库。

谢谢。这正是我想做的。我想使用像variable这样的反向引用;我不想再重写一个很长的正则表达式。
str = 'Bob Martin brought a car on January 20, 1962. On Feb. the 23rd, Bob sold his car. The 21st of March will be fun.'

re.findall('''
       (?P<Month> (Jan(uary|\.)) | (Feb(ruary|\.)) | (Mar(ch|\.))) # Months
     | (?P=Month)\sthe\s\d{2}(rd|st)
     | [Tt]he\s\d{2}(rd|st)\sof(?P=Month)
'''
str, re.X")