我的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
而不用它周围的括号和括号。
如何调整我的代码,使其只打印匹配,而不包括括号和圆括号?
谢谢!
答案 0 :(得分:2)
你得到的错误可能是因为你的正则表达式没有返回findall函数的任何匹配。请尝试在尝试之前检查 re.findall 返回的对象的返回类型索引它。在索引之前使用此代码,这样如果列表为空,则不会引发indexerror。
x = re.findall(r'Name=[^;]+', line)
if not len(x):
#write your logic
答案 1 :(得分:2)
它将其打印为列表,因为..它是一个列表。
返回字符串中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"
谢谢!