Регулярное выражение, чтобы игнорировать определенное количество повторений символов - PullRequest
2 голосов
/ 27 февраля 2010

Я пытаюсь написать синтаксический анализатор, который использует два символа в качестве границ токена, но я не могу понять регулярное выражение, которое позволит мне игнорировать их, когда я экранирую регулярное выражение всей строки.

С учетом строки типа:

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

Я бы хотел закончить с:

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

где все из | сбегают, если их нет вместе.

Есть ли регулярное выражение, которое позволит мне избежать каждого | что не в паре?

Ответы [ 3 ]

2 голосов
/ 27 февраля 2010

Не нужно регулярное выражение. Вы используете 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 голос
/ 27 февраля 2010

Я не понимаю, почему вам нужно было бы регулярное выражение-экранировать токены, но почему бы сначала не разделить строку и , а затем избежать их? Это регулярное выражение разделяется на две трубы, которые не предшествуют или не сопровождаются несколькими трубами:

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

Кстати, есть тестеры для всех наиболее распространенных регулярных выражений для Googling. Вот один для Python: http://re.dabase.com/

0 голосов
/ 27 февраля 2010

Вот способ сделать это с помощью регулярных выражений в 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 \|
...