2013-04-10 7 views
-1

Мне нужно регулярное выражение для обнаружения символа 'a', за которым следует пробел, за которым следует слово или слова, заключенные в кавычки. Мне нужно взять это слово или слова, и использовать их в замещении, как "Ъ \ 1"Regex Необязательные котировочные знаки

Итак:

a "foo bar" 
a 'foo bar' 
a foo 
a 
a foo bar 

должны стать:

b foo bar 
b foo bar 
b foo 
a 
a foo 

Что такое регулярное выражение I необходимость?

+0

'' Это забавная вещь о струнах, - сказал он. «Они могут включать« цитаты »в кавычки!» ' – 2013-04-10 22:08:45

+0

' .replace (/ a ['"]? Foo \ b /,' b foo ')' – Aust

+0

@JackManey Не эти. @ Aust Я не уверен как это работает с критериями – user1277170

ответ

0

попробовать:

a ('(.+)'|"(.+)"|(\B+)) 

Заменено:

b $2$3$4 

Да, как ни странно Python, кажется, не любят пустых групп перехвата. Насколько мне известно, большинство реализаций регулярных выражений не имеют проблемы. Вы всегда можете сделать это в два этапа, хотя:

temp = re.sub(r"a (['\"])(.*)\1",r"b \2", string) 
return re.sub(r"a (\w*)",r"b \1", temp) 

Или три:

temp = re.sub(r"a (\"(.*)\"",r"b \1", string) 
temp = re.sub(r"a ('(.*)'",r"b \1", temp) 
return re.sub(r"a (\w*)",r"b \1", temp) 

Вы можете также отказаться от использования sub, и строить выход из группы самостоятельно, что-то вдоль линий:

regex = re.compile(r"^a (([\"'])(.*)\2.*|(\w*).*)$",re.MULTILINE) 
matches = re.finditer(regex,string) 
for match in matches: 
    if match.group(3) is not None: 
     print 'b {0}'.format(match.group(3)) 
    elif match.group(4) is not None: 
     print 'b {0}'.format(match.group(4)) 
+0

Я вижу, что он делает, но python жалуется, что не все группы 2, 3 и 4. Соответствие: – user1277170

+0

Было довольно интересно, может ли быть определенный целевой язык. Все реализации регулярных выражений не созданы равными – femtoRgon

0

Если кавычки не допускаются в кавычки что-то, как это может работать:

perl -pe 's/^a (['\''"]?)(.+)\1$/b $2/' <<EOT 
a "foo bar" 
a 'foo bar' 
a foo 
a 
EOT 

Выход

b foo bar 
b foo bar 
b foo 
a 

Но также работает для a foo bar (заменяемый в б). Это нормально? Он не соответствует a "".

+0

Нет, только одно слово при некотировании. – user1277170

+0

Затем попробуйте 'perl -pe 's/^ a ([' \ ''"]) (\ w. +) \ 1 $/b $ 2 /; s/^ a (\ S +) $/b $ 1/''. Это не изменит 'foo bar'. – TrueY

Смежные вопросы