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

Posted

技术标签:

【中文标题】Python re.findall 将输出打印为列表而不是字符串【英文标题】:Python re.findall prints output as list instead of string 【发布时间】:2015-06-02 06:20:34 【问题描述】:

我的 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 而不带方括号和括号。

如何调整我的代码,使其只打印匹配项,而不用括号和括号括起来?

谢谢!

【问题讨论】:

print re.findall(r'Name=[^;]+', line)[0] 应该可以解决问题。 您是否期待不止一场比赛?如果没有 - 请改用re.search 这两个建议都适用于我的几个正则表达式,但是,它们不适用于我脚本中的另一个正则表达式。 print re.findall(r'Name=[^;]+', line)[0] 返回“列表索引超出范围”的错误,使用 print re.search().group 返回“NoneType”错误对象没有属性“组”。我检查了正则表达式是否找到了预期的字符串,如果我只是打印 re.findall() 它会打印结果,但它会将输出打印为 list 。有任何想法吗?谢谢! @Ilea 不可能。如果 re.search 返回 NoneType,则没有匹配项。请显示您的代码,包括该行。 更新您的问题,包括您在其中的评论中的信息。 【参考方案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" 

谢谢!

【讨论】:

【参考方案2】:

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

findall():

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

要仅打印字符串,请改用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])

【讨论】:

【参考方案3】:

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

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

【讨论】:

以上是关于Python re.findall 将输出打印为列表而不是字符串的主要内容,如果未能解决你的问题,请参考以下文章

除了所有输入数据之外,将 re.findall() 输出到 CSV

python:非正则表达式等价于 re.findall

Python re.search和re.findall的比较

re模块的基本用法

Python re.search和re.findall的比较

Python中的re.findall('(\d)\\1+','33acad122')怎么理解,求详