如何让re.search返回一个字符串?

时间:2016-12-19 10:05:54

标签: python regex string

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

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返回字符串吗?

2 个答案:

答案 0 :(得分:2)

您似乎只需要=>之间的字符串部分。在这种情况下,围绕字母数字模式使用捕获组要容易得多,并且将re.findall与永远不会返回None的{​​{1}}一起使用,但只有空列表才能使用如果找到,则匹配或捕获的文本列表。此外,我怀疑您需要空匹配,因此请使用+代替*

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

然后

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

答案 1 :(得分: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一起使用。