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



我正在尝试创建一个正则表达式来匹配一年中月份的数字 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

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

最新更新