2

トークンの境界として2文字を使用するパーサーを作成しようとしていますが、文字列全体をregexエスケープするときに、それらを無視できる正規表現がわかりません。

次のような文字列が与えられます:

This | is || token || some ||| text

最終的には次のようになります。

This \| is || token || some \|\|\| text

ここですべての| それらが2つ一緒にない限り、エスケープされます。

すべてを逃れることができる正規表現はありますか?それはペアではありませんか?

4

3 に答える 3

2

正規表現は必要ありません。結局のところ、あなたはPythonを使用しています。:)

>>> s="This | is || token || some ||| text"
>>> items=s.split()
>>> items
['This', '|', 'is', '||', 'token', '||', 'some', '|||', 'text']
>>> for n,i in enumerate(items):
...     if "|" in i and i.count("|")!=2:
...          items[n]=i.replace("|","\|")
...
>>> print ' '.join(items)
This \| is || token || some \|\|\| text
于 2010-02-27T10:27:30.487 に答える
1

トークンを正規表現エスケープする必要がある理由がわかりませんが、最初に文字列を分割してからエスケープしないのはなぜですか? この正規表現は、先行または後続のパイプがない 2 つのパイプで分割されます。

re.split('(?<!\|)\|\|(?!\|)', 'This | is || token || some ||| text')
>>> ['This | is ', ' token ', ' some ||| text']

ところで、Google には、より一般的な正規表現のすべてのテスターが存在します。これは Python 用のものです: http://re.dabase.com/

于 2010-02-27T12:31:43.700 に答える
0

興味があれば、perlの正規表現でそれを行う方法は次のとおりです。2つの別々の正規表現を使用しました。1つは単一の一致用で、もう1つは3つ以上の一致用です。それらを組み合わせることができると確信していますが、正規表現は、不必要な複雑さを追加せずに読み取るのにすでに十分に困難です。

#!/usr/bin/perl

#$s = "This | is || token || some ||| text";
$s = "| This |||| is || more | evil |";

$s =~ s/([^|]|^)(\|)([^|]|$)/\1\\\2\3/g;
$s =~ s{(\|{3,})}
{
   $a = $1;
   $a =~ s{\|} {\\\|}g;
   $a;
}eg;

print $s . "\n";

出力:

\| This \|\|\|\| is || more \| evil \|
于 2010-02-27T11:05:28.663 に答える