3

以下を変換したいと思います。

"some text http://one.two.three.source.com more text. more text more text http://source.com more text. more text http://one.source.com more text more text. moreテキストhttp://one.two.source.comもっとテキスト もっとテキスト"

これに:

"some text http://one_two_three.target.com more text more text more text http://target.com more text more text http://one.target.com more text more text more text 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

ここでは、関数を置換として使用するとうまく収まります。

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 に答える
0

問題は、一致した式に 2 つの異なる変更を適用していることです。ファイル全体に変更の 1 つを適用し、この新しい式と照合して、キャプチャされたグループを使用して再構築することをお勧めします。

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

これは、ハレックスの答えのバリエーションです。grouperfrom itertools レシピは の結果を処理するのに役立ち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 に答える