2

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

给定一个字符串,如:

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

我想结束:

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

所有的| 除非他们两个在一起,否则会逃脱。

是否有一个正则表达式可以让我逃避每一个 | 那不是成对的吗?

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

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

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

顺便说一句,谷歌搜索有所有更常见的正则表达式风格的测试人员。这是 Python 的一个:http ://re.dabase.com/

于 2010-02-27T12:31:43.700 回答
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 \|
于 2010-02-27T11:05:28.663 回答