在Python中替换两个字符串之间的所有文本

27

假设我有:

a = r''' Example
This is a very annoying string
that takes up multiple lines
and h@s a// kind{s} of stupid symbols in it
ok String'''

我需要一种方法来替换(或删除)在"This"和"ok"之间的文本,这样当我调用它时,现在的值将等于:

a = "Example String"

我找不到任何有效的通配符。非常感谢您提供帮助。

6个回答

21
你需要 正则表达式
>>> import re
>>> re.sub('\nThis.*?ok','',a, flags=re.DOTALL)
' Example String'

22
更详细的解释会更有帮助。 - Khan Shahrukh

10
另一种方法是使用字符串分割:
def replaceTextBetween(originalText, delimeterA, delimterB, replacementText):
    leadingText = originalText.split(delimeterA)[0]
    trailingText = originalText.split(delimterB)[1]

    return leadingText + delimeterA + replacementText + delimterB + trailingText

限制:

  • 不检查分隔符是否存在
  • 假设不存在重复的分隔符
  • 假定分隔符以正确的顺序出现

7
使用 re.sub:它将两个字符符号字符串之间的文本替换为所需的字符符号字符串
format: re.sub('A?(.*?)B', P, Q, flags=re.DOTALL)

其中: A:字符、符号或字符串 B:字符、符号或字符串 P:用于替换A和B之间文本的字符、符号或字符串 Q:输入字符串 re.DOTALL:匹配所有行
import re
re.sub('\nThis?(.*?)ok', '', a,  flags=re.DOTALL)

output : ' Example String'

让我们看一个以 HTML 代码为输入的例子。
input_string = '''<body> <h1>Heading</h1> <p>Paragraph</p><b>bold text</b></body>'''

目标:移除 <p> 标签。
re.sub('<p>?(.*?)</p>', '', input_string,  flags=re.DOTALL)

output : '<body> <h1>Heading</h1> <b>bold text</b></body>'

目标:将 `

` 标签替换为单词 `test`。

re.sub('<p>?(.*?)</p>', 'test', input_string,  flags=re.DOTALL)

otput : '<body> <h1>Heading</h1> test<b>bold text</b></body>'

5

关键在于DOTALL标志。通常,'.'字符不匹配换行符,因此您不能在字符串中跨行匹配。如果设置DOTALL标志,则re将根据需要跨越尽可能多的行匹配'.*'。


4
a=re.sub('This.*ok','',a,flags=re.DOTALL)

1
如果您想要第一个和最后一个单词:
re.sub(r'^\s*(\w+).*?(\w+)$', r'\1 \2', a, flags=re.DOTALL)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接