Python的re.findall打印输出为列表而不是字符串

6

我的re.findall搜索匹配并返回了正确的字符串,但是当我尝试打印结果时,它将其作为列表而不是字符串打印出来。以下是示例:

> line =  ID=id5;Parent=rna1;Dbxref=GeneID:653635,Genbank:NR_024540.1,HGNC:38034;gbkey=misc_RNA;gene=WASH7P;product=WAS protein family homolog 7 pseudogene;transcript_id=NR_024540.1

> print re.findall(r'gene=[^;\n]+', line)

>     ['gene=WASH7P']

我希望打印函数只返回gene=WASH7P,不带括号和圆括号。您如何调整代码以便仅打印匹配项,而不带括号和圆括号?谢谢!

7
print re.findall(r'Name=[^;]+', line)[0] 可以解决问题。 - Marcin
3
你是否期望匹配多个结果?如果不是的话,可以使用re.search - Jon Clements
这些建议对我几个正则表达式起作用了,但是它们对我脚本中的另一个正则表达式没有作用。print re.findall(r'Name=[^;]+', line)[0]返回一个错误,提示"list index is out of range"。而使用print re.search().group 则会返回'NoneType' object has no attribute 'group'的错误。我已经检查过这个正则表达式能否找到目标字符串,如果我只是print re.findall(),那么它会输出结果,但是输出的是一个列表形式的结果。你有什么想法吗?谢谢! - Ilea
1
@Ilea 不可能的。如果re.search返回NoneType,则没有匹配项。请展示您的代码,包括该行。 - Jerry
请更新您的问题,并将评论中的信息包含在其中。 - user
谢谢@Jerry - 我也认为这是不可能的 - 所以我被那个结果难住了。我刚刚想出了为什么会发生这种情况(在我的答案中解释)。 - Ilea
3个回答

5
感谢大家的帮助!
以下两个代码都成功将输出作为字符串打印出来。
> re.findall(r'gene=[^;\n]+', line)[0]  

> re.search(r'gene=[^;\n]+', line).group

然而,即使当我仅使用re.findall()时输出结果,我仍然遇到了其中一个正则表达式的“索引超出范围”的错误。

> re.findall(r'transcript_id=[^\s]+',line)

我意识到这个看似不可能的结果是因为我在一个循环中调用了re.findall()方法,该循环遍历了文件中的每一行。对于一些行来说,它们匹配成功了,但对于另一些行来说,它们没有匹配成功,所以我会在那些没有匹配成功的行上收到“list index out of range”的错误提示。
下面的代码解决了这个问题:
> if re.findall(r'transcript_id=[^\s]+',line):

>    transcript = re.findall(r'transcript_id=[^\s]+',line)[0]

> else:

>   transcript = "NA" 

谢谢你!

3

它将其作为列表打印,因为……它是一个列表。

findall():

返回字符串中模式的所有非重叠匹配项,作为字符串列表

如果只想打印字符串,请使用print(re.findall(r'Name=[^;]+', line)[0])

该代码假设您只有一次匹配。如果你没有匹配,你会得到一个错误。如果你有更多,你只会打印第一个匹配结果。

在使用[0](或re.search().group())之前,确保您已找到匹配项,以避免出现错误。

s = re.search(r'Name=[^;]+', my_str)
if s:
    print(s.group())

或者print(s[0])

2
你得到的错误可能是由于你的正则表达式在findall函数中没有返回任何匹配项所导致。在尝试索引之前,请尝试检查re.findall返回的对象的返回类型。在索引之前使用这段代码,如果列表为空,它就不会引发“indexerror”。
x = re.findall(r'Name=[^;]+', line)
if not len(x):
    #write your logic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接