Это возможно с регулярными выражениями? - PullRequest
2 голосов
/ 18 декабря 2009

Примерно так:

/[abcd]/[efgh]/

Идея состоит в том, что a будет заменено на e, b на f, c на g и т. Д.

В идеале это должно быть независимо от языка. Если это невозможно, у меня есть альтернативное решение (поскольку это регулярное выражение генерируется некоторым кодом, я могу сделать одно для каждой из возможных замен).

Ответы [ 7 ]

7 голосов
/ 18 декабря 2009

В perl tr выполняет замену символов:

tr/abcd/efgh/

Будет делать то, что предлагает ваш пример.

2 голосов
/ 18 декабря 2009

В sed выражение y/// делает именно это.

Это также синоним tr/// в perl

0 голосов
/ 18 декабря 2009

Существует UNIX-команда 'tr', которая делает это в дополнение к ответам на Perl и Python ...

0 голосов
/ 18 декабря 2009

В PHP это можно сделать, передавая массивы в preg_replace.

$outputText = preg_replace($arraySource, $arrayTarget, $inputText);

$arraySource[0] is replaced by $arrayTarget[0]

$arraySource[1] is replaced by $arrayTarget[1]

$arraySource[2] is replaced by $arrayTarget[2]

      .                              .

      .                              .

      .                              .

      .                              .

и т. Д.

0 голосов
/ 18 декабря 2009

Если вы действительно хотите сделать это в регулярном выражении: некоторые языки могут иметь выражение в правой части регулярного выражения, поэтому, возможно, что-то вроде (Perl):

$ foo = ~ s / x ([a-d]) / "x" .chr (ord ($ 1) +4) / e

сделает трюк, хотя ужасно и, вероятно, не совсем то, что вам нужно.

0 голосов
/ 18 декабря 2009

ну, с Python, также не нужно использовать регулярные выражения

>>> import string
>>> FROM="abcd"
>>> TO="efgh"
>>> table=string.maketrans(FROM,TO)
>>> print "a cold day".translate(table)
e golh hey
0 голосов
/ 18 декабря 2009

В Python это возможно с передачей лямбда-функции в re.sub

>>> import re
>>> d={"a":"e","b":"f","c":"g","d":"h"}
>>> re.sub("[abcd]",lambda x:d[x.group(0)],"abcd")
'efgh'

Обычно просто сопоставление "a" и "e" не очень полезно.

Это будет более полезно, как в следующем случае, когда вы хотите изменить a, b, c, d на e, f, g, h, когда перед ними стоит «x». Это можно сделать с помощью одного регулярного выражения.

>>> re.sub("(?<=x)[abcd]",lambda x:d[x.group(0)],"xaxbxcxdaabbccdd")
>>>'xexfxgxhaabbccdd'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...