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

2024-04-25 19:03:07 发布

您现在位置:Python中文网/ 问答频道 /正文

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

如何调整代码,使其只打印匹配项,而不在其周围使用括号和圆括号?

谢谢你!


Tags: 字符串reid示例列表linenr括号
3条回答

您得到的错误可能是因为您的regex没有返回findall函数的任何匹配项。请在尝试索引之前检查re.findall返回的对象的返回类型。在索引之前使用此代码,以便如果list为空,则不会引发索引器错误。

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

谢谢大家的帮助!

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

> 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" 

谢谢你!

它把它打印成一个列表,因为。。这是一张单子。

findall()

Return all non-overlapping matches of pattern in string, as a list of strings.

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

相关问题 更多 >