0

次の形式の文字列があります。

"Hello, this is a test. Let's tag @[William Maness], and then tag @[Another name], along with @[More Name]."

私はそれを変換したい...

"Hello, this is a test. Let's tag <a href='/search/william-maness'>William Maness</a>, and then tag <a href='/search/another-name'>Another name</a>, along with [...]"

これは正規表現で実行できると確信していますが、少し複雑すぎて解決できません。どんな助けでも大歓迎です。

4

3 に答える 3

2

このような名前は、次のものと一致させることができます。

r'@\[([^]]+)\]'

キャプチャグループは、元のテキストの角かっこで囲まれた名前を囲みます。

次に、に渡された関数を使用しsub()て、次のルックアップに基づいて名前をリンクに置き換えることができます。

def replaceReference(match):
    name = match.group(1)
    return '<a href="/search/%s">%s</a>' % (name.lower().replace(' ', '-'), name)

refs = re.compile(r'@\[([^]]+)\]')
refs.sub(replaceReference, example)

関数には、見つかった一致ごとに一致オブジェクトが渡されます。キャプチャグループはで取得され.groups(1)ます。

この例では、名前は非常に単純な方法で変換されますが、たとえば、名前が存在するかどうかを実際のデータベースチェックを行うことができます。

デモ:

>>> refs.sub(replaceReference, example)
'Hello, this is a test. Let\'s tag <a href="/search/william-maness">William Maness</a>, and then tag <a href="/search/another-name">Another name</a>, along with <a href="/search/more-name">More Name</a>.'
于 2012-10-26T20:27:36.320 に答える
2

re.sub()関数も受け入れるため、置換テキストを処理できます。

import re

text = "Hello, this is a test. Let's tag @[William Maness], and then tag @[Another name], along with @[More Name]."

def replace(match):
    text = match.group(1)  # Extract the first capturing group

    return '<a href="/search/{0}">{1}</a>'.format(  # Format it into a link
        text.lower().replace(' ', '-'),
        text
    )

re.sub(r'@\[(.*?)\]', replace, text)

または、読みやすいワンライナーを探している場合:

>>> import re
>>> re.sub(r'@\[(.*?)\]', (lambda m: (lambda x: '<a href="/search/{0}">{1}</a>'.format(x.lower().replace(' ', '-'), x))(m.group(1))), text)
'Hello, this is a test. Let\'s tag <a href="/search/william-maness">William Maness</a>, and then tag <a href="/search/another-name">Another name</a>, along with <a href="/search/more-name">More Name</a>.'
于 2012-10-26T20:29:57.387 に答える
0

@Martijn の正規表現を使用する:

>>> s
"Hello, this is a test. Let's tag @[William Maness], and then tag @[Another name], along with @[More Name]."
>>> re.sub(r'@\[([^]]+)\]', r'<a href="/search/\1</a>', s)
'Hello, this is a test. Let\'s tag <a href="/search/William Maness</a>, and then tag <a href="/search/Another name</a>, along with <a href="/search/More Name</a>.'

ただし、ユーザー名をずる賢くする必要があります。

于 2012-10-26T20:32:54.623 に答える