【发布时间】:2013-08-15 03:53:19
【问题描述】:
我有一个文本文件,如果它前面没有紧跟数字,则需要删除字母“t”。
我正在尝试使用 re.sub 执行此操作,但我有这个:
f=open('File.txt').read()
g=f
g=re.sub('([^0-9])t','',g)
这会识别要正确删除的字母,但也会删除前面的字符。如何在替换字符串中引用带括号的正则表达式? 谢谢!
【问题讨论】:
我有一个文本文件,如果它前面没有紧跟数字,则需要删除字母“t”。
我正在尝试使用 re.sub 执行此操作,但我有这个:
f=open('File.txt').read()
g=f
g=re.sub('([^0-9])t','',g)
这会识别要正确删除的字母,但也会删除前面的字符。如何在替换字符串中引用带括号的正则表达式? 谢谢!
【问题讨论】:
改用lookbehind(或否定lookbehind)。
g=re.sub('(?<=[^0-9])t','',g)
或
g=re.sub('(?<![0-9])t','',g)
【讨论】:
'tt'中看到一个匹配。
三个选项:
g=re.sub('([^0-9])t','\\1',g)
或
g=re.sub('(?<=[^0-9])t','',g)
或
g=re.sub('(?<![0-9])t','',g)
第一个选项是您要查找的内容,即对捕获的字符串的反向引用。 \\1 将引用第一个捕获的组。
lookarounds 不消耗字符,因此您不需要将它们替换回来。在这里,我对第一个使用了正面的lookbehind,对第二个使用了负面的lookbehind。那些不使用括号内的字符,因此您不会在替换中使用[^0-9] 或[0-9]。使用它们可能会更好,因为它可以防止重叠匹配。
正向后视确保t 前面有一个非数字字符。否定的lookbehind确保t前面没有数字字符。
【讨论】:
g=re.sub('([^0-9])t', r'\1',g) 第一个。我还没那么习惯 python ^^;