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

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

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。

481830 次浏览

str.replace()做固定替换。使用re.sub()代替。

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

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

这个测试片段应该做到这一点:

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)

但我强烈建议花一两个小时学习基本知识。对于初学者,你需要了解哪些字符是特殊的:“metacharacters"需要转义(即在前面放置反斜杠-并且字符类内外的规则是不同的。)有一个很棒的在线教程:www.regular-expressions.info。你在那里花费的时间将会为你带来数倍的回报。regex快乐!

最简单的方法

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

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

你必须使用re模块:

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

我会像这样(在评论中解释了regex):

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的正则表达式烹饪书

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)