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

时间:2015-03-29 05:05:28

标签: python regex findall

我的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']

我希望print函数只返回gene=WASH7P而不用它周围的括号和括号。

如何调整我的代码,使其只打印匹配,而不包括括号和圆括号?

谢谢!

3 个答案:

答案 0 :(得分:2)

你得到的错误可能是因为你的正则表达式没有返回findall函数的任何匹配。请尝试在尝试之前检查 re.findall 返回的对象的返回类型索引它。在索引之前使用此代码,这样如果列表为空,则不会引发indexerror。

x = re.findall(r'Name=[^;]+', line)
if not len(x):
    #write your logic

答案 1 :(得分:2)

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

findall()

  

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

仅打印字符串而使用print(re.findall(r'Name=[^;]+', line)[0])

该代码假设你有一个匹配。如果您有0个匹配项,则会收到错误消息。如果你有更多,你只会打印第一场比赛。

为确保您没有收到错误,请在使用[0](或.group() re.search())之前检查是否找到匹配项。

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

print(s[0])

答案 2 :(得分:1)

感谢大家的帮助!

以下两个代码都成功地将输出打印为字符串。

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

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

然而,我正在继续在我的一个正则表达式中获得“列表索引超出范围”错误,即使我刚刚使用re.findall()时打印结果。

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

我意识到这个看似不可能的结果是因为我在 for 循环中调用re.findall(),该循环遍历文件中的每一行。某些行有匹配但其他行没有匹配,所以我收到了那些没有匹配的行的“列表索引超出范围”错误。

以下代码解决了问题:

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

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

> else:

>   transcript = "NA" 

谢谢!