Python正则表达式:搜索和替换古怪

Python正则表达式:搜索和替换古怪,python,regex,replace,Python,Regex,Replace,对于Python正则表达式问题,我真的需要一些帮助。你会期待结果的 import re re.sub("s (.*?) s", "no", "this is a string") “这不是绳子”,对吧?但实际上这是“偷窃”。子函数使用整个模式作为要替换的组,而不仅仅是我实际要替换的组 所有re.sub示例都处理简单的单词替换,但是如果您想根据字符串的其余部分更改某些内容,该怎么办?就像在我的例子中 任何帮助都将不胜感激 编辑: “向后看”和“向前看”技巧在我的情况下不起作用,因为它们需要固定

对于Python正则表达式问题,我真的需要一些帮助。你会期待结果的

import re
re.sub("s (.*?) s", "no", "this is a string") 
“这不是绳子”,对吧?但实际上这是“偷窃”。子函数使用整个模式作为要替换的组,而不仅仅是我实际要替换的组

所有re.sub示例都处理简单的单词替换,但是如果您想根据字符串的其余部分更改某些内容,该怎么办?就像在我的例子中

任何帮助都将不胜感激

编辑:

“向后看”和“向前看”技巧在我的情况下不起作用,因为它们需要固定宽度。以下是我的实际表达:

re.sub(r"<a.*?href=['\"]((?!http).*?)['\"].*?>", 'test', string)

re.sub(r“使用
(?您的正则表达式匹配从第一个s到最后一个s的所有内容,因此如果您将匹配项替换为“否”,则会得到“thinotring”

括号不限制匹配,它们在一个名为backreference的特殊变量中捕获与其中任何内容匹配的文本。在您的示例中,backreference number 1将包含
是一个
。您可以稍后在同一正则表达式中使用反斜杠和反引用的编号来引用反引用:
\1

您可能想要的是四处看看:

re.sub(r"(?<=s ).*?(?= s)", "no", "this is a string")
好的,这是一个精心设计的示例,但它展示了您可以做什么。从您的编辑中,很明显您正在尝试使用正则表达式解析HTML。现在这不是一个好主意。搜索“正则表达式HTML”,您将看到原因

如果您仍然想这样做:

re.sub(r"(<a.*?href=['"])((?!http).*?['"].*?>)", r'\1http://\2', string)

re.sub(r)(好的,环顾四周是可能的,只需要一点重写。这可以:

def absolutize(string, prefix):
    return re.sub(r"(?<=href=['\"])((?!http).*?)(?=['\"])", prefix+r'\1', string)
def绝对化(字符串,前缀):

return re.sub(r)(?您的表达式虽然看起来很糟糕,但确实有效,但您没有捕获re.sub的结果,它返回替换的字符串,并且不对作为参数传递的字符串执行替换

import re

new_string = re.sub(r"<a.*?href=['\"]((?!http).*?)['\"].*?>", 'test', string)
print new_string
重新导入
新字符串=re.sub(r)


顺便说一句,您最好使用Beautiful Soup或类似的工具来系统地搜索和替换HTML,使用正则表达式是个坏主意。

这是一个非常标准的正则表达式系统-唯一的问题是语法比Perl更冗长。O:-)


另一种选择是使用[^>]*而不是。*,因为您只需要包含在单个链接中的结果。如果您有一个包含多个HREF的链接,则可能会失败(据我所知,这不应该发生),否则它会起作用。

遗憾的是,这行不通,请参见我在编辑的问题中的新示例。我采用了与您和eumiro相同的解决方案。谢谢大家!请注意,您可能指定了非贪婪(
(.*)
),但来自“this”的“s”在来自“is”的“s”之前开始匹配,并且根据规范
re
返回第一个可能的匹配。
re.sub(r"(<a.*?href=['"])((?!http).*?['"].*?>)", r'\1http://\2', string)
def absolutize(string, prefix):
    return re.sub(r"(?<=href=['\"])((?!http).*?)(?=['\"])", prefix+r'\1', string)
import re

new_string = re.sub(r"<a.*?href=['\"]((?!http).*?)['\"].*?>", 'test', string)
print new_string