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