我想寫一個解析器,使用兩個字符作爲標記邊界,但我找不到正則表達式,這將允許我忽略它們,當我正則表達式 - 逃避整個字符串。正則表達式忽略一定數量的字符重複
給予相同的字符串:
This | is || token || some ||| text
我想直到結束:
This \| is || token || some \|\|\| text
所有的|除非它們中的兩個在一起,否則它們將被轉義。
是否有正則表達式可以讓我逃脫每一個|那不是一對?
我想寫一個解析器,使用兩個字符作爲標記邊界,但我找不到正則表達式,這將允許我忽略它們,當我正則表達式 - 逃避整個字符串。正則表達式忽略一定數量的字符重複
給予相同的字符串:
This | is || token || some ||| text
我想直到結束:
This \| is || token || some \|\|\| text
所有的|除非它們中的兩個在一起,否則它們將被轉義。
是否有正則表達式可以讓我逃脫每一個|那不是一對?
不需要正則表達式。畢竟,你正在使用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
如果任何人有興趣,可以用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 \|
我不明白你爲什麼會需要正則表達式轉義令牌,但爲什麼不先分手的字符串,然後逃脫他們?在未通過多個管道的前面或後面兩個管道此正則表達式分裂:
re.split('(?<!\|)\|\|(?!\|)', 'This | is || token || some ||| text')
>>> ['This | is ', ' token ', ' some ||| text']
順便說一句,對於大家比較常見的正則表達式的口味在那裏的谷歌搜索的測試。這裏有一個用於Python的:http://re.dabase.com/
什麼語言?有些具有先進的正則表達式功能。 – vava 2010-02-27 10:06:18
我正在使用python,但嘗試通過Regexr測試表達式,我相信這是使用Flex內置的任何東西。 – kyleder 2010-02-27 10:15:26