Python 正则表达式否定强制字符存在

Python Regex negation forces character to be present

我正在尝试创建一个正则表达式来匹配一年中月份的数字 1-12(其中第一个数字是可选的)和一个月中几天的 1-31,而不附加从 1 到 12 的所有数字.(想象一下内存,如果这是 1 - 100 万)

pd.Series(["some text8some text","some text13some text", "05"]).str.extract('(?P<mm>[1][012]|(?:[0])?[1-9])') 

在 8 上正常工作,但在 13 上而不是忽略它匹配到 1。 所以我尝试了

pd.Series(["some text8some text","13some text", "05"]).str.extract('(?P<mm>[1][012]|(?:[0])?[1-9][^0-9])')

但它强制我在 8 之后有一个字符,否则不匹配。

有人可以帮助解决这个正则表达式的否定问题吗,它迫使我在 8 之后匹配一个字符?

所需的输出是

0: 8
1: Nan 
2: 5

由于没有空格,单词边界将不起作用,因此我们不得不使用正则表达式否定。

您需要使用锚点或单词边界:

\b(?:1[0-2]|[1-9])\b

参见a demo on regex101.com


对于 pandas,这可能是:

import pandas as pd

df = pd.Series(["8","13", "text in between 13 as well", "here is an 8 hidden"]).str.extract(r'(?P<mm>\b(?:1[0-2]|[1-9])\b)') 
print(df)

这会产生

0      8
1    NaN
2    NaN
3      8
Name: mm, dtype: object