我想在段落的第一行更改字符串foo而不更改另一行。我已经使用模式^和$来匹配像perl那样的确切字符串,但仍然没有运气。求助。
我的代码:
input_file = "foo afooa"
input_file = re.sub(r'^foo$', 'bar', input_file)
print input_file
所以,我期待这样的结果:
bar afooa
提前致谢
答案 0 :(得分:1)
从doc,您可以设置count = 1
re.sub()
只更改模式的第一个匹配项。另外,请删除^
和$
,因为您不想搜索仅包含单词foo
的整行。示例代码:
import re;
input_file = "foo afooa";
input_file = re.sub(r'foo', 'bar', input_file, count = 1);
print input_file;
答案 1 :(得分:1)
您的正则表达式目前为r'^foo$'
,它基本上与字符串“foo”匹配。的 仅 强>
如果您刚刚将其更改为r'^foo'
,则只要“foo”#39;在字符串的开头找到,但与之前的模式不同,它并不关心foo之后的内容。
以下是一个例子:
input_file = "foo afooa"
input_file = re.sub(r'^foo', 'bar', input_file)
input_file2 = "foob afooa"
input_file2 = re.sub(r'^foo', 'bar', input_file2)
print input_file
print input_file2
输出:
bar afooa
barb afooa
现在,如果你不想匹配字符串的一部分,但是匹配整个字符串' foo'在行的开头,那么你需要添加一个边界' \ b'匹配如下所示:
input_file = "foo afooa"
input_file = re.sub(r'^foo\b', 'bar', input_file)
input_file2 = "foob afooa"
input_file2 = re.sub(r'^foo\b', 'bar', input_file2)
print input_file
print input_file2
输出:
bar afooa
foob afooa
或者,如果您只想替换第一次出现的完整单词&f 39,那么请使用@DineshPundkar建议的模式,并将替换次数限制为1,如刚才提到的@Tuan333。
因此,在这种情况下,您的代码将如下所示:
input_file = "a foo afooa foo bazfooz"
input_file = re.sub(r'\bfoo\b', 'bar', input_file, 1)
print input_file
输出:
a bar afooa foo bazfooz
答案 2 :(得分:0)
而不是^和$,使用\ b来匹配边界。
>>> a="foo afooa"
>>> b= re.sub(r"\bfoo\b",'bar',a)
>>> b
'bar afooa'
>>>