我正在尝试匹配文件行中的字符串并写下匹配减去第一个和最后一个
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 group
,groups()
返回.write
需要的内容一个元组等
知道如何让.search
返回字符串吗?
答案 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一起使用。