【问题标题】:AttributeError: 'NoneType' object has no attribute 'group' while using re.matchAttributeError: 'NoneType' 对象在使用 re.match 时没有属性 'group'
【发布时间】:2013-09-23 20:15:14
【问题描述】:

我需要比较两个不同文件的第一个元素某个短语之后。到目前为止,我有这个:

import re

data1 = ""
data2 = ""
first = re.match(r".*Ignore until after this:(?P<data1>.*)", firstlist[0])
second = re.match(r".*Ignore until after this:(?P<data2>.*)", secondarray[0])
data1 = first.group('data1')
data2 = second.group('data2')

if data1 == data2:
  #rest of the code...

我想在某个点之前忽略所有内容,然后将其余部分保存到变量中。我在脚本的前面做了一些几乎相同的事情,它可以工作。但是,当我运行它时,我得到了这个错误:

File "myfile.py", line [whatever line it is], in <module>  
data1 = first.group('data1')  
AttributeError: 'NoneType' object has no attribute 'group'

为什么re.match 不能与 first 和 second 一起正常工作?

编辑

根据建议,我已将[\s\S]* 更改为.*

编辑 2:这是输入的样子(不像下面的评论):

Random text

More random text

Even more random text

Ignore until after this:

Meaningful text, keep this

...and everything else...

...until the end of the file here

基本上就是这样:在某一点之后需要保存的一串文本

【问题讨论】:

  • 你为什么使用[\s\S]*?由于\S\s 的倒数,所以您也可以使用.* 并完成它(使用re.DOTALL)。
  • 我也尝试过这种方法并得到了同样的错误,\s\S 只是有点抓住稻草,试图改变任何可能导致问题的东西,只是忘记了切换回来
  • 然后我们需要查看输入样本。您不需要“声明”data1data2,顺便说一句。
  • 没有足够的信息让我们重现您的问题,更不用说帮助您了。
  • 对不起,我的电脑太笨了,不让我用正确的格式编辑评论,我将在问题中添加输入示例

标签: python regex


【解决方案1】:

您可能只是因为文件中的换行符而遇到问题。正如 Martijn Pieters 在 cmets 中对您的问题指出的那样,您可以使用标志 re.DOTALL 来捕获所有内容。所以有了这样的文件,(在这个例子中命名为tmp

Random text

More random text

Even more random text

Ignore until after this:

Meaningful text, keep this

...and everything else...

...until the end of the file here

你可以这样做

with open('tmp') as f:
  first = re.match(r'.*Ignore until after this:(?P<data1>.*)', f.read(), re.DOTALL)
  print(first.group('data1'))

给了

Meaningful text, keep this

...and everything else...

...until the end of the file here

【讨论】:

  • 谢谢,我实际上最终以一种非常特定于我的项目布局的正则表达式解决了这个问题(所以可能对其他人发布没有帮助),但我我将此标记为答案,因为这最初是我遇到的问题:)
【解决方案2】:

点“。”正则表达式中的字符匹配除换行符以外的任何字符。因此,如果您将整个文件作为单个字符串,则正则表达式匹配到第一个新行,然后尝试将您的短语与下一行的开头匹配。当这失败时,它返回一个 NoneType。

请参阅 thisthis

【讨论】:

  • 谢谢,问题是它不会是第一个换行符。我最初用 [\s\S]* 而不是 .* 来匹配包括换行符在内的所有内容,但我遇到了同样的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-08-03
  • 1970-01-01
  • 2019-01-01
  • 2021-12-26
  • 2019-07-23
  • 2018-05-13
  • 2020-09-07
相关资源
最近更新 更多