2

問題

Python正規表現を使用してWikiページをFlexWikiエンジンからFOSwikiエンジンに移行し、2つのエンジンのマークアップ言語の違いを処理しています。

参考までに、 FlexWikiマークアップFOSwikiマークアップ

名前を変更したリンクを変換しようとする場合を除いて、ほとんどの変換は非常にうまく機能します。どちらのウィキも、マークアップで名前が変更されたリンクをサポートしています。

たとえば、Flexwikiは以下を使用します。

"Link To Wikipedia":[http://www.wikipedia.org/]

FOSwikiは以下を使用します:

[[http://www.wikipedia.org/][Link To Wikipedia]]

どちらも、書き換えられたハイパーリンクを生成します。

正規表現を使用しています

renameLink = re.compile ("\"(?P<linkText>[^\"]+)\":\[(?P<linkTarget>[^\[\]]+)\]")

FlexWikiマークアップからリンク要素を解析します。

"Link Text":[LinkTarget]

確実にグループを生み出している

<linkText> = Link Text
<linkTarget = LinkTarget

re.subを使用して、解析されたコンテンツをFOSwikiマークアップに挿入しようとすると、問題が発生します。

私の正規表現の経験は、何も書いてはいけませんが、グループを考えると、私はその印象を受けています

<linkText> = Link text
<linkTarget = LinkTarget

のような行

line = renameLink.sub ( "[[\g<linkTarget>][\g<linkText>]]" , line )

生成する必要があります

[[LinkTarget][Link Text]]

しかし、私が得ているテキストファイルへの出力では

[[LinkTarget [[Link Text]]

名前が変更されたリンクが壊れます。

少しいじった後、回避策を実行しました。

line = renameLink.sub ( "[[\g<linkTarget>][ [\g<linkText>]]" , line )

を生成します

[[LinkTarget][ [[Link Text]]

これは、FOSwikiに表示すると次のようになります

[[Link Text

これは機能しますが、あまりきれいではありません。

私が変換しようとしているページには、おそらくこれらの名前が変更されたリンクのインスタンスが何千もあるので、手動で修正するのは良くありません。記録として、Python2.5.4とPython2.7.3でスクリプトを実行したところ、同じ結果が得られました。

構文で本当に明白な何かが欠けていますか?または、簡単な回避策はありますか?

解決

元の表現には何の問題もありませんでした。

スクリプト内の他の正規表現を実行し始め、名前が変更されたリンク式と重複している可能性があると思われる行をコメントアウトしました。これでうまくいったようです。半永久的な修正として、リンクに焦点を当てた式と他の式を別々のスクリプトに分割し、次々に実行しました。

ここでの道徳は、表現が重複していないことを再確認することだと思います。

試みられた解決策(上記の解決策を参照してください)

文字列の追加

line = renameLink.sub ( "[[\g<linkTarget>]" + "[\g<linkText>]]" , line )

を生成します

[[linkTarget [[Link Text]]

連結をどのようにスライスするかは関係ありません。結果は同じです。

角かっこをエスケープする、例:

line = renameLink.sub ( "\[\[\g<linkTarget>\]\[\g<linkName>\]\]" , line )

を生成します

\[ [[LinkTarget\]] [Link Text\]\]
4

3 に答える 3

3

Flexwiki-to-FOSwiki

コード:

import re
text = '"Link To Wikipedia":[http://www.wikipedia.org/]'
print re.sub(r'"([^"]+)":\[([^\]]+)\]', r'[[\2][\1]]', text)

出力:

[[http://www.wikipedia.org/][Link To Wikipedia]]

こちらのコードを参照してテストしてください。

于 2012-06-25T15:57:06.280 に答える
0

のような行

line = renameLink.sub ( "[[\g<linkTarget>][\g<linkText>]]" , line )

生成する必要があります

[[LinkTarget][Link Text]]

そして、そうです。例:

line = r""""Link Text":[LinkTarget]"""
renameLink = re.compile("\"(?P<linkText>[^\"]+)\":\[(?P<linkTarget>[^\[\]]+)\]")
print(renameLink.sub ("[[\g<linkTarget>][\g<linkText>]]", line))

出力:

[[LinkTarget][Link Text]]

あなたはおそらくあなたの表現以外の場所で問題を抱えています。

于 2012-06-25T15:40:46.070 に答える
0

私はあなたが言った通りに試しました。私はPython2.7.1バージョンを使用しています。

これが結果です

>>> text = '"Link To Wikipedia":[http://www.wikipedia.org/]'
>>> renameLink = re.compile ("\"(?P<linkText>[^\"]+)\":\[(?P<linkTarget>[^\[\]]+)\]")
>>> s = renameLink.match(text)
>>> lnkname, lnk = s.groups()
>>> substr = "[[%s][%s]]" % (lnk, lnkname)
>>> renameLink.sub(substr, text)
'[[http://www.wikipedia.org/][Link To Wikipedia]]'

それはすべてうまくいきます。

于 2012-06-25T15:42:09.787 に答える