0

どのようにそれ自体<ref> *some text*</ref>と一緒に内部のテキストを削除しますか?ref

'...and so on<ref>Oxford University Press</ref>.'

re.sub(r'<ref>.+</ref>', '', string)後に空白が続く<ref>場合 にのみ削除されます<ref>

編集:それは私が推測する単語の境界と関係があります...または?

EDIT2私が必要としているのは、それ</ref>が改行上にある場合でも、最後の(終了)を計算することです。

4

4 に答える 4

3

<ref>...</ref>貼り付けられたコードは文字列の一部を削除するため、実際には問題はありません。しかし、あなたがそれを意味し、空のrefタグが削除されていない場合:

re.sub(r'<ref>.+</ref>', '', '...and so on<ref></ref>.')

次に、.+ を .* に変更する必要があります。

+ は 1 つ以上を意味し、* は 0 つ以上を意味します。

http://docs.python.org/library/re.htmlから:

'.' (Dot.) In the default mode, this matches any character except a newline.
    If the DOTALL flag has been specified, this matches any character including
    a newline.
'*' Causes the resulting RE to match 0 or more repetitions of the preceding
    RE, as many repetitions as are possible. ab* will match ‘a’, ‘ab’, or ‘a’
    followed by any number of ‘b’s.
'+' Causes the resulting RE to match 1 or more repetitions of the preceding
    RE. ab+ will match ‘a’ followed by any non-zero number of ‘b’s; it will
    not match just ‘a’.
'?' Causes the resulting RE to match 0 or 1 repetitions of the preceding RE.
    ab? will match either ‘a’ or ‘ab’.
于 2010-11-10T22:04:28.500 に答える
1

</ref>複数の終了sがあるという理由だけで、大量のテキストを削除しないように注意する必要があります。私の意見では、以下の正規表現の方がより正確です。

r'<ref>[^<]*</ref>'

これにより、「貪欲な」マッチングが防止されます。

ところで: The Regex Coach と呼ばれる、正規表現を分析およびテストするための優れたツールがあります。http://www.weitz.de/regex-coach/で見つけることができます。

編集: 最初の段落にコード タグを追加するのを忘れていました。

于 2010-11-10T22:38:29.563 に答える
1

意図したことだけを行うための派手な正規表現を作成することもできますが、DOTALL と非貪欲な検索を使用する必要があり、正規表現が一般的にどのように機能するかを理解する必要がありますが、それは理解していません。

最良のオプションは、正規表現ではなく文字列メソッドを使用することです。これはとにかくよりPythonicです。

while '<reg>' in string:
    begin, end = string.split('<reg>', 1)
    trash, end = end.split('</reg>', 1)
    string = begin + end

非常に一般的になりたい場合は、タグまたはタグ内の空白とプロパティの奇妙な大文字化を許可しますが、これも行うべきではありませんが、html/xml 解析ライブラリの学習に投資してください。lxmlは現在、広く推奨されており、十分にサポートされているようです。

于 2010-11-10T22:40:54.563 に答える
0

これを正規表現で行おうとすると、大変なことになります。何かを効果的に解析しようとしていますが、パーサーはそのタスクに対応していません。

次の例のように、文字列全体で貪欲に一致させると、おそらく食い込みすぎます。

<ref>SDD</ref>...<ref>XX</ref>

真ん中全体をきれいにすることになります。

Beautiful Soupのようなパーサーが本当に必要です。

from BeautifulSoup import BeautifulSoup, Tag
s = "<a>sfsdf</a> <ref>XX</ref> || <ref>YY</ref>"
soup = BeautifulSoup(s)
x = soup.findAll("ref")
for z in x:
  soup.ref.replaceWith('!')
soup # <a>sfsdf</a> ! || !
于 2010-11-10T22:49:18.403 に答える