1

誰かがこの PHP 正規表現を Python に変換できますか? 何度か試してみましたが、成功しませんでした:

function convertLinks($text) {
    return preg_replace("/(?:(http:\/\/)|(www\.))(\S+\b\/?)([[:punct:]]*)(\s|$)/i",
    "<a href=\"http://$2$3\" rel=\"nofollow\">$1$2$3</a>$4$5", $text);
}

編集: [:punct:] は [!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~] に置き換えられることがわかったので、私はこれを試しました:

def convertLinks(text):
    pat = re.compile(ur"""(?:(http://)|(www\.))(\S+\b\/?)([!"#$%&'()*+,\-./:;<=>?@[\\\]^_`{|}~]*)(\s|$)""", re.IGNORECASE)
    return pat.sub(ur'<a href=\"http://\2\3" rel=\"nofollow\">\1\2\3</a>\4\5', text)

しかし、convertLinks(u"Test www.example.com test") で "unmatched group" エラーを受け取りました。

4

2 に答える 2

2

この式では、Python では動作が異なるいくつかの機能が使用されています。

  • [[:punct:]]Python には文字グループがありません。POSIX正規表現参照を使用して展開しました。

  • 式はオプションのグループを使用します。http:// または www.開始時に一致しますが、置換で両方を使用します。これは Python では失敗します。解決策: 置換関数を使用します。

したがって、同じ機能を得るには、次を使用できます。

import re

_link = re.compile(r'(?:(http://)|(www\.))(\S+\b/?)([!"#$%&\'()*+,\-./:;<=>?@[\\\]^_`{|}~]*)(\s|$)', re.I)

def convertLinks(text): 
    def replace(match):
        groups = match.groups()
        protocol = groups[0] or ''  # may be None
        www_lead = groups[1] or ''  # may be None
        return '<a href="http://{1}{2}" rel="nofollow">{0}{1}{2}</a>{3}{4}'.format(
            protocol, www_lead, *groups[2:])
    return _link.sub(replace, text)

デモ:

>>> test = 'Some text with www.stackoverflow.com links in them like http://this.too/with/path?'
>>> convertLinks(test)
'Some text with <a href="http://www.stackoverflow.com" rel="nofollow">www.stackoverflow.com</a> links in them like <a href="http://this.too/with/path" rel="nofollow">http://this.too/with/path</a>?'
于 2013-07-10T10:25:24.710 に答える
0

Python で正規表現を使用する場合は、reモジュールの使用を検討する必要があります。この例では、具体的にはre.sub.

構文は次のようになります。

output = re.sub(regular_expression, what_it_should_be_replaced_by, input)

re.sub()置換された文字列を返すことを忘れないでください。

于 2013-07-10T10:24:44.983 に答える