如何在string.replace中输入正则表达式?

问题描述 投票:0回答:8

我需要一些关于声明正则表达式的帮助。我的输入如下:

this is a paragraph with<[1> in between</[1> and then there are cases ... where the<[99> number ranges from 1-100</[99>. 
and there are many other lines in the txt files
with<[3> such tags </[3>

所需的输出是:

this is a paragraph with in between and then there are cases ... where the number ranges from 1-100. 
and there are many other lines in the txt files
with such tags

我试过这个:

#!/usr/bin/python
import os, sys, re, glob
for infile in glob.glob(os.path.join(os.getcwd(), '*.txt')):
    for line in reader: 
        line2 = line.replace('<[1> ', '')
        line = line2.replace('</[1> ', '')
        line2 = line.replace('<[1>', '')
        line = line2.replace('</[1>', '')
        
        print line

我也尝试过这个(但似乎我使用了错误的正则表达式语法):

        line2 = line.replace('<[*> ', '')
        line = line2.replace('</[*> ', '')
        line2 = line.replace('<[*>', '')
        line = line2.replace('</[*>', '')

我不想将

replace
从 1 硬编码到 99。

python regex string replace
8个回答
847
投票

这个经过测试的片段应该可以做到:

import re
line = re.sub(r"</?\[\d+>", "", line)

编辑:这是一个注释版本,解释了它是如何工作的:

line = re.sub(r"""
  (?x) # Use free-spacing mode.
  <    # Match a literal '<'
  /?   # Optionally match a '/'
  \[   # Match a literal '['
  \d+  # Match one or more digits
  >    # Match a literal '>'
  """, "", line)

正则表达式有趣!但我强烈建议花一两个小时学习基础知识。对于初学者,您需要了解哪些字符是特殊的:“元字符”需要转义(即前面放置反斜杠 - 并且字符类内部和外部的规则不同。)有一个很好的在线教程: :www.regular-expressions.info。您在那里度过的时间将带来数倍的回报。快乐的调整!


62
投票

str.replace()
进行固定替换。请使用
re.sub()
来代替。


31
投票

我会这样(正则表达式在评论中解释):

import re

# If you need to use the regex more than once it is suggested to compile it.
pattern = re.compile(r"</{0,}\[\d+>")

# <\/{0,}\[\d+>
# 
# Match the character “<” literally «<»
# Match the character “/” literally «\/{0,}»
#    Between zero and unlimited times, as many times as possible, giving back as needed (greedy) «{0,}»
# Match the character “[” literally «\[»
# Match a single digit 0..9 «\d+»
#    Between one and unlimited times, as many times as possible, giving back as needed (greedy) «+»
# Match the character “>” literally «>»

subject = """this is a paragraph with<[1> in between</[1> and then there are cases ... where the<[99> number ranges from 1-100</[99>. 
and there are many other lines in the txt files
with<[3> such tags </[3>"""

result = pattern.sub("", subject)

print(result)

如果您想了解有关正则表达式的更多信息,我建议您阅读 Jan Goyvaerts 和 Steven Levithan 的 Regular Expressions Cookbook


17
投票

最简单的方法

import re

txt='this is a paragraph with<[1> in between</[1> and then there are cases ... where the<[99> number ranges from 1-100</[99>.  and there are many other lines in the txt files with<[3> such tags </[3>'

out = re.sub("(<[^>]+>)", '', txt)
print out

15
投票

字符串对象的replace方法不接受正则表达式,只接受固定字符串(参见文档:http://docs.python.org/2/library/stdtypes.html#str.replace)。

你必须使用

re
模块:

import re
newline= re.sub("<\/?\[[0-9]+>", "", line)

5
投票

不必使用正则表达式(对于您的示例字符串)

>>> s
'this is a paragraph with<[1> in between</[1> and then there are cases ... where the<[99> number ranges from 1-100</[99>. \nand there are many other lines in the txt files\nwith<[3> such tags </[3>\n'

>>> for w in s.split(">"):
...   if "<" in w:
...      print w.split("<")[0]
...
this is a paragraph with
 in between
 and then there are cases ... where the
 number ranges from 1-100
.
and there are many other lines in the txt files
with
 such tags

4
投票
import os, sys, re, glob

pattern = re.compile(r"\<\[\d\>")
replacementStringMatchesPattern = "<[1>"

for infile in glob.glob(os.path.join(os.getcwd(), '*.txt')):
   for line in reader: 
      retline =  pattern.sub(replacementStringMatchesPattern, "", line)         
      sys.stdout.write(retline)
      print (retline)

0
投票

Biopython 库包含处理 fasta 和genebank 文件的优秀工具。

from Bio import SeqIO
import re

with open('input.fasta' , 'r') as in_fh, open('output.fasta', 'w') as out_fh:
    for seq_record in SeqIO.parse(in_fh, "fasta"):
        newheader = re.sub("(.+\.\d+).*(\[.*)", r"\1 new_string \2", seq_record.description)
        seq_record.description = newheader
        SeqIO.write(seq_record, out_fh, "fasta")
© www.soinside.com 2019 - 2024. All rights reserved.