2016-03-30 6 views
1

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

Пример строка выглядит следующим образом:

asdf $asdf.asdf.$ $..asdf$ 

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

\$([^$]*)\$ 

поэтому для строки примера он должен дать четыре совпадения. Как я могу это достичь?

+0

Что такое регулярное выражение вкус? Или лучше, что такое язык программирования? –

+0

Попробуйте ['(?: \ $ (?! (?: [^ $] * \ $ [^ $] * \ $) * [^ $] * $) | (?! ^) \ G) [^ $ .] * \ K \ .'] (https://regex101.com/r/vD1fE4/2), если это PCRE. –

+0

Язык программирования - python. Но я мог бы использовать модуль pcre, так что ваше выражение тоже будет работать, я думаю. – aem

ответ

2

Поскольку вы используете Python, самым простым решением будет использовать шаблон, чтобы соответствовать подстроки из $ в $, и заменить . все, что вы хотите с лямбда:

import re 
s = "a.sdf $asdf.asdf.$. . .$..asdf$" 
r = re.compile(r'\$([^$]*)\$') 
print(r.sub(lambda m: m.group().replace('.',''), s)) 
# => a.sdf $asdfasdf$. . .$asdf$ 

См IDEONE demo

0

Я думаю, что это будет очень сложно с регулярным выражением, так как вы должны в каком-то смысле считать знаки доллара (вы хотите только называть каждый второй промежуток между двумя знаками доллара «вложенными», а остальные «наружу» справа ?)

Таким образом, кажется проще (например, питона)

  • сделать mystring.split('$'), который дает вам список
  • затем принять каждый второй элемент, например, newlist = oldlist[1::2]
  • сосчитать точки (''.join(newlist).count('.'))
Смежные вопросы