3

我希望转换以下内容:

“一些文本http://one.two.three.source.com更多文本。更多文本更多文本http://source.com更多文本。更多文本 http://one.source.com更多文本更多文本。更多文字http://one.two.source.com更多文字更多文字”

对此:

“一些文本http://one_two_three.target.com更多文本更多文本更多文本http://target.com更多文本更多文本 http://one.target.com更多文本更多文本更多文本http://one_two。 target.com更多文字更多文字”

我希望转换'.' 在大量文本中将每个子域分隔为“_”,问题是我想让它以是否有子域为条件。我无法预测文本的其余部分,并且只需要为 url 模式进行转换。

这是我到目前为止所拥有的:

src = 'source.com'
dst = 'target.com'
reMatch = r'http(?P<a>s?):(?P<b>\\?)/(?P<c>\\?)/(?P<d>([^.:/]+\.)?)(?P<e>([^.:/]+\.)?)(?P<f>([^.:/]+\.)?)' + src
p = re.compile(reMatch, re.IGNORECASE)
reReplace = r'http\g<a>:\g<b>/\g<c>/\g<d>\g<e>\g<f>' + dst
p.sub(reReplace, content)

它仅将 'source.com' 替换为 'target.com' 并复制子域(最多 3 个)但不替换 '.' 在子域之间使用“_”。

4

4 回答 4

1

我构建了一个函数,可以根据您的输入实现您想要的输出:

def special_replace(s):
    p=re.compile(r"(http://.*?)(\.?source\.com)")
    spl=p.split(s)
    newtext=[]
    for text in spl:
        if text.startswith("http://"):
            text=text.replace(".","_")
        elif text.endswith("source.com"):
            text=text.replace("source.com", "target.com")
        newtext.append(text)
    return "".join(newtext)

它不是那么优雅,但它达到了你的目标:)。

于 2012-09-05T18:20:40.857 回答
0

这是halex答案的变体。grouper来自itertools recipes在处理re.split.

def special_replace(s):
    spl = re.split(r"(http://.*?)(\.?source\.com)", s)
    return "".join(
        itertools.chain(*((
                  text,
                  part1.replace(".", "_"),
                  part2.replace("source.com", "target.com"))
              for text, part1, part2 in grouper(3, spl, ""))))
于 2012-09-05T20:02:09.850 回答
0

困难在于您要对匹配的表达式应用两个不同的更改。我建议您在整个文件中应用其中一项更改,然后匹配这个新表达式,以便使用捕获的组重建它:

text = re.sub(r'(http://[^ ]*)source\.com\b', r'\1target.com', text)
pattern = re.compile(r'(http://[^ ]+)\.([^ ]*target.com)\b')

while (pattern.search(text)):
   text = pattern.sub(r'\1_\2', text)
于 2012-09-06T11:24:35.843 回答
0

这里是使用函数作为替换的地方很适合:

def replace_dots(source):
    from_dot_com = 'source.com'
    to_dot_com = 'target.com'

    pat = re.compile(r'(https?://)(\S*?)(\.?)'
                     + re.escape(from_dot_com),
                        re.IGNORECASE)

    def my_fun(match):
        return (match.group(1) 
            + match.group(2).replace('.', '_') # <--
            + match.group(3) + to_dot_com)

    result = pat.sub(my_fun, source)

    return result
于 2012-09-16T14:03:28.127 回答