【问题标题】:How to get re.search to return a string?如何让 re.search 返回一个字符串?
【发布时间】:2016-12-19 10:05:54
【问题描述】:

我正在尝试匹配文件行中的字符串并将匹配项减去第一个和最后一个

import os, re

infile=open("~/infile", "r")
out=open("~/out", "w")
pattern=re.compile("=[A-Z0-9]*>")
for line in infile:
    out.write( pattern.search(line)[1:-1] + '\n' )

问题是它说Match 不可下标,当我尝试添加.group() 它说Nonegroup has no attritube groupgroups() 返回.write 需要一个元组等

知道如何让.search 返回一个字符串吗?

【问题讨论】:

  • 如果你想要一个字符串为什么不使用re.findall
  • 如果显示'NoneType' object has no attribute 'group',则表示搜索不成功。
  • @PhilipTzou 您应该将其发布为答案。
  • @Jean-FrançoisFabre :P 只是懒惰。
  • 仅仅一个 re.findall 是不够的,因为 OP 需要在结果中实际删除 =>

标签: python regex string


【解决方案1】:

re.search 函数返回一个Match 对象。

如果匹配失败,re.search 函数将返回 None。要提取匹配文本,请使用Match.group 方法。

>>> match = re.search("a.", "abc")
>>> if match is not None:
...     print(match.group(0))
'ab'
>>> print(re.search("a.", "a"))
None

也就是说,使用组来查找匹配的所需部分可能是一个更好的主意:

>>> match = re.search("=([A-Z0-9]*)>", "=abc>")  # Notice brackets
>>> match.group(0)
'=abc>'
>>> match.group(1)
'abc'

这个正则表达式随后可以与 @WiktorStribiżew 建议的 findall 一起使用。

【讨论】:

  • OP 已经在这样做了,但由于没有匹配项,他们遇到了错误。
  • 另外,你认为他得到的错误不一定是那个错误。
【解决方案2】:

您似乎只需要=> 之间的字符串部分。在这种情况下,在字母数字模式周围使用 捕获组 并将其与永远不会返回 Nonere.findall 一起使用会更容易,但在不匹配时只是一个空列表,或者捕获的文本列表(如果找到)。另外,我怀疑你需要空匹配,所以使用+ 而不是*

pattern=re.compile(r"=([A-Z0-9]+)>")
                      ^         ^

然后

"\n".join(pattern.findall(line))

【讨论】:

    猜你喜欢
    • 2021-09-22
    • 1970-01-01
    • 1970-01-01
    • 2015-03-08
    • 2013-11-23
    • 2016-08-11
    • 2014-12-11
    • 1970-01-01
    • 2013-03-31
    相关资源
    最近更新 更多