2

私はいくつかの入力でこの正規表現を使用します、

[^a-zA-Z0-9@#]

ただし、これにより、入力内の多くのhtml特殊文字(次のような)が削除されます。

#227;, #1606;, #1588; (i had to remove the & prefix so that it wouldn't 
show up as the actual value..)

正規表現式を満たすようにそれらを値に変換する方法はありますか?また、なぜテキストがこんなに大きくなったのかわかりません。

4

3 に答える 3

4

テキストに名前のないエンティティが数値でコード化されているように見える場合は、最初にxmlエンティティ定義(アンパサンド、ハッシュ、数字、セミコロン)を含むバイト文字列をUnicodeに変換できます。

import re
xed_re = re.compile(r'&#(\d+);')
def usub(m): return unichr(int(m.group(1)))

s = 'ã, ن, ش'
u = xed_re.sub(usub, s)

ターミナルエミュレータが任意のUnicodeグリフを表示できる場合は、が表示されprint uます

ã, ن, ش

いずれの場合も、必要に応じて、元のREを使用できます。誤ってエンティティを「キャッチ」することはなく、ASCII文字、数字、およびリストした句読文字のカップルのみを使用できます。(それが本当に必要なものかどうかはわかりませんが、たとえば、アクセント付きの文字ではなく、ASCII文字だけを使用するのはなぜですか?-しかし、それ必要な場合は機能します)。

数値コード化されたエンティティに加えて名前付きエンティティがある場合、別の回答で推奨されている標準ライブラリモジュールを適用することもできます(ただし、Latin-1コードポイントにマップされる名前付きエンティティのみを扱います)。htmlentitydefs

于 2010-05-03T00:03:35.617 に答える
1

次のスクリプトを適応させることができます。

import htmlentitydefs
import re

def substitute_entity (match):
    name = match.group (1)
    if name in htmlentitydefs.name2codepoint:
        return unichr (htmlentitydefs.name2codepoint[name])
    elif name.startswith ('#'):
        try:
            return unichr (int (name[1:]))
        except:
            pass

    return '?'

print re.sub ('&(#?\\w+);', substitute_entity, 'x « y &wat; z {')

ここで次の答えを生成します。

x « y ? z {

編集:私は質問を「さらに処理する前にHTMLエンティティを取り除く方法」として理解しました。間違った質問に答えるのに時間を無駄にしないことを願っています;)

于 2010-05-02T23:46:32.903 に答える
0

式が何に使用されているかを知らなければ、私はあなたが何を必要としているのか正確に言うことができません。

これは、文字、数字、@、および#を除く特殊文字または文字列と一致します。

[^a-zA-Z0-9@#]*|#[0-9A-Za-z]+;
于 2010-05-02T23:45:30.753 に答える