正则表达式忽略一定数量的字符重复

时间:2010-02-27 10:01:54

标签: python regex regex-negation

我正在尝试编写一个使用两个字符作为标记边界的解析器,但我无法弄清楚当我正则表达式转义整个字符串时允许我忽略它们的正则表达式。

给出一个字符串:

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

我想最终:

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

所有的所有|除非有两个在一起,否则将被转义。

是否有正则表达式允许我逃避每个|那不是一对吗?

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

我不明白为什么你需要regex-escape标记,但为什么不首先拆分字符串然后然后转义它们?这个正则表达式分裂在两个不在更多管道之前或之后的管道上:

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

顺便说一句,有一些测试人员可以使用谷歌搜索所有比较常见的正则表达式。这是Python的一个:http://re.dabase.com/

答案 2 :(得分: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 \|