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.search和re.findall的比较