基本上我想写一个将清理URL的脚本,用"(dot)"字符串替换点 . 例如,如果我在运行脚本后http://www.google.com,我希望它是http://www(dot)google(dot) . 当我的文本文件只包含网址或其他字符串时,这很容易用.replace实现,但在我的情况下,我的文本文件中也有IP地址,我不希望IP地址中的点更改为"(dot)" .
我尝试使用正则表达式,但我的输出是“http://ww(dot)oogl(dot)om 192.60.10.10 33.44.55.66”
这是我的代码
from __future__ import print_function
import sys
import re
nargs = len(sys.argv)
if nargs < 2:
sys.exit('You did not specify a file')
else:
inputFile = sys.argv[1]
fp = open(inputFile)
content = fp.read()
replace = '(dot)'
regex = '[a-z](\.)[a-z]'
print(re.sub(regex, replace, content, re.M| re.I| re.DOTALL))
我想我需要有一个条件来检查模式是否为number.number - 不要替换 .
4 回答
您必须在点之前和之后存储
[a-z]
内容,以便将其再次放入替换后的字符串中 . 我在这里解决了它:你可以使用lookahead和lookbehind断言:
为了工作字母和数字,这应该有把戏,确保至少有一个字母:
对于您的文件,您需要
re.M
:如果文件很大并且内存是个问题,你也可以逐行进行,要么将所有行存储在列表中,要么在使用每行时:
根据您的代码判断,您希望替换模式中的第一个组 . 但是,
re.sub
替换整个匹配模式,而不是组 . 在你的情况下,这是句点之前的单个字符,句点本身和它之后的单个字符 .即使子工作符合您的期望,您的正则表达式也会缺少数字是URL的一部分,例如
www.2048game.com
. 定义IP看起来更容易 . 它's always a set of four numbers with one, two or three digits each, separated by dots. (In the case of IPv4, anyway. But IPv6 does not use periods, so it doesn'在这里 . )假设您的文本文件中只有URL和IP,只需过滤掉所有IP,然后替换其余URL中的句点:
当然,如果您在
content
中有常规文本,这也将替换所有常规时段,而不仅仅是URL . 在这种情况下,您首先需要更复杂的URL检测 . 见In search of the perfect URL validation regex