正则表达式替换python中的文本

正则表达式替换python中的文本,python,Python,我的文本看起来像: Added "a-foo-b" foo. 目标是使用一个正则表达式来替换第二个foo-to-bar,并保持两个双引号之间的第一个foo不变。 因此,在上面的文本中,我想要的结果是: Added "a-foo-b" bar. 谢谢如果您的文本总是以点结尾,您可以尝试以下方法: echo 'Added "a-foo-b" foo.' | sed s/foo\.$/bar/g Added "a-foo-b" bar 既然你说的目标是让双引号中的一个单独存在,我就把双引号作

我的文本看起来像:

Added "a-foo-b" foo.
目标是使用一个正则表达式来替换第二个foo-to-bar,并保持两个双引号之间的第一个foo不变。 因此,在上面的文本中,我想要的结果是:

Added "a-foo-b" bar.

谢谢

如果您的文本总是以点结尾,您可以尝试以下方法:

echo 'Added "a-foo-b" foo.'  | sed s/foo\.$/bar/g

Added "a-foo-b" bar
既然你说的目标是让双引号中的一个单独存在,我就把双引号作为重点。括号形成一个“匹配组”,用于保存匹配的字符串;这个匹配组匹配双引号及其内部内容,然后模式匹配第二个foo。替换模式将替换我们匹配的所有内容,但这没关系,因为我们使用
\1
放回匹配组部分,然后使用
替换第二个
foo

如果您知道要替换的
foo
之后不能再出现双引号,那么这可能是一种更好的模式:

pat = re.compile(r'(".*".*)foo')
这个模式匹配一个双引号,然后是任何东西,然后是另一个双引号。如果带引号的字符串包含转义双引号,则第一种模式将不起作用,但此模式会起作用。但如果在该字符串上使用此模式:

s = '''Added "a-foo-b" foo.  "Wow, another foo"'''
匹配组将匹配第二个foo,并匹配第三个foo,即使它在引号中。这是因为模式匹配是“贪婪的”

编辑:

问题:是的,如果
s=''添加了“a-foo-b”foo.删除了“a-foo-b”怎么办?'

答:如果模式始终保持不变,那么您知道在双引号中不会有转义双引号,您可以使用第一个模式。然后,您可以应用多个模式来检测和/或替换您想要的任何内容
pat_在下面添加的
解决了我们之前想要解决的问题;它锚定在字符串的
已添加的
部分,因此它不会对字符串的
已删除的
部分执行任何操作。如果您确实希望匹配并替换引号内的部分字符串,
pat_deleted
显示了如何进行匹配和替换;它有三个比赛组,将第一组和最后一组放回,让您替换中间的一组。事实上,我们并不需要一个中间的比赛小组;我们可以将要更换的部件留在比赛小组之外,就像我们在第一个模式中所做的那样

import re
pat_added = re.compile(r'(Added\s+"[^"]+"\s+)\w+')
pat_deleted = re.compile(r'(Deleted\s+"[a-z]-)([^-]+)(-[a-z]"\.)')

s = '''Added "a-foo-b" foo.Deleted "a-foo-b".'''
s = re.sub(pat_added, r'\1bar', s)
s = re.sub(pat_deleted, r'\1bar\3', s)
print(s)

使用字符串方法的方法

>>> s='Added "a-foo-b" foo test'
>>> needle='foo'
>>> rind=s.rfind('foo')
>>> if rind!=-1:
...  s=s[:rind] + needle + s[rind+len(needle):]

re.sub(r'foo',bar',s)#这将替换文本中的所有foo-to-bar。你能相信句号终结者在那里吗?这不是python:-)并让OP在发布答案之前显示一些努力……好的,我只是认为查看正则表达式会有所帮助。:-)不错,但是如果你想跳过引号中的所有
foo
-s呢?是的,如果s=''添加了“a-foo-b”foo.删除了“a-foo-b.”
>>> s='Added "a-foo-b" foo test'
>>> needle='foo'
>>> rind=s.rfind('foo')
>>> if rind!=-1:
...  s=s[:rind] + needle + s[rind+len(needle):]