2010-02-27 40 views
2

我想寫一個解析器,使用兩個字符作爲標記邊界,但我找不到正則表達式,這將允許我忽略它們,當我正則表達式 - 逃避整個字符串。正則表達式忽略一定數量的字符重複

給予相同的字符串:

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

我想直到結束:

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

所有的|除非它們中的兩個在一起,否則它們將被轉義。

是否有正則表達式可以讓我逃脫每一個|那不是一對?

+0

什麼語言?有些具有先進的正則表達式功能。 – vava 2010-02-27 10:06:18

+0

我正在使用python,但嘗試通過Regexr測試表達式,我相信這是使用Flex內置的任何東西。 – kyleder 2010-02-27 10:15:26

回答

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 
0

如果任何人有興趣,可以用perl中的正則表達式來實現。我使用了兩個單獨的正則表達式,一個用於單個匹配,另一個用於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 \| 
1

我不明白你爲什麼會需要正則表達式轉義令牌,但爲什麼不先分手的字符串,然後逃脫他們?在未通過多個管道的前面或後面兩個管道此正則表達式分裂:

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

順便說一句,對於大家比較常見的正則表達式的口味在那裏的谷歌搜索的測試。這裏有一個用於Python的:http://re.dabase.com/