【问题标题】:Python Regex negation forces character to be present [duplicate]Python正则表达式否定强制字符存在[重复]
【发布时间】:2018-04-07 18:48:57
【问题描述】:

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

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

【问题讨论】:

  • 你能说得更具体点吗?给我们一个输入示例和期望的输出?
  • 是的,8 的期望输出是 8,13 的输出是 Nan。谢谢,我会编辑问题
  • 它与那些问题不同:|最初的意图是为了直观地使用正则表达式否定,因为它不需要将文本与数字分开的单词边界或空白字符。但是,我希望替代解决方案在数据集上可以正常工作。谢谢@Jan
  • 没有空格作为单词边界
  • @dev:看看这里的环视:regex101.com/r/kFnIsJ/1

标签: python regex pandas regex-negation


【解决方案1】:

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

\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

【讨论】:

  • 不,我的数据可能在文本之间
  • @dev:那就用词界,已经更新了答案和demo。
  • 对不起,执行后不匹配8
  • @dev:是的,确实如此,检查代码。
  • 它不适用于单词边界。请参阅此pd.Series(["8","13", "text in between13as well", "here is an8hidden"]).str.extract(r'(?P&lt;mm&gt;\b(?:1[0-2]|[1-9])\b)') 与隐藏的 8 不匹配。没有空格可用作单词边界。感谢@Jan 的帮助
猜你喜欢
  • 2019-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-16
  • 1970-01-01
  • 2010-11-01
  • 1970-01-01
  • 2017-04-01
相关资源
最近更新 更多