使用Python正则表达式清理输入字符串

3
我可以帮您翻译。以下是翻译结果,保留html标签:

我有一个字符串: text = 'href = "www.google.com" onmouseover = blahblah >' 我想要的是'href = "www.google.com">'

目前,我的函数看起来像这样:

text = re.sub(r'href = \".*\".*>', 'href = \".*\">', text)

这段代码最终会删除网站链接并用字符串“.*”替换它。我认为我应该以某种方式使用?Pname?,但不知道如何编写它,以便获得正确的输出。

2个回答

1

你不想替换.*,而是想替换第一个匹配的.*

为此,你需要一个反向引用,像\1这样。

也就是说,你需要一些东西让反向引用可以引用回来——一个捕获组,比如(.*)而不是.*

更一般地说,替换字符串不是正则表达式,它是一种不同的东西——基本上,它是一个模板,除了反向引用之外都是文本字符。因此,你不想尝试转义引号,除非你想在结果中得到字面上的反斜杠。

所以:

>>> re.sub(r'href = \"(.*)\".*>', r'href = "\1">', text)
'href = "www.google.com">'

更详细的解释,请参见正则表达式 HOWTO 中的 搜索和替换


*或者它可以是一个函数,该函数接受每个匹配对象并返回一个字符串。

谢谢!我不知道如何正确使用分组。 - iczyje
@user3709454:这份HOWTO非常简短且写得很好,所以值得一读。当然,你不会记住所有的细节,但希望你能记住足够多的内容,以便下次遇到问题时知道该去寻找什么。 - abarnert
@user3709454 如果这确实是答案的话,最好将此回答标记为"答案",方法是点击复选框。这能帮助其他遇到类似问题的人们,无需阅读评论即可看到哪个答案对你有效。 - Nick Humrich

0

实现您的目标的另一种方法是通过截取子字符串来完成。不需要使用正则表达式。思路是使用字符串方法index()找到第二个双引号字符的位置。

对于一个名为input的字符串,此表达式将给出第二个双引号字符的位置:

input.index('"', input.index('"')+1)

如果该值为k,则写入input[:k+1]以提取从开头到第二个双引号字符的所有内容。
请在您的Python解释器中尝试以下内容。
input = 'href = "www.google.com" onmouseover=hax0rFunction()>'
k = input.index('"', input.index('"')+1)
input[0:k+1]

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