разделить запятой, если запятая не находится в скобках, при этом символы могут находиться за пределами скобок с тем же разделением запятой - PullRequest
2 голосов
/ 12 марта 2019

У меня есть этот скрипт на Python.Это использует некоторое регулярное выражение.Я хочу разбить строку s, но запятые, игнорируя любые запятые, которые существуют в скобках.

s = """aa,bb,(cc,dd),m(ee,ff)"""
splits = re.split(r'\s*(\([^)]*\)|[^,]+)', s, re.M|re.S)
print('\n'.join(splits))
Actual output:
    aa
    ,
    bb
    ,
    (cc,dd)
    ,
    m(ee
    ,
    ff)
Desired output: 
    aa
    bb
    (cc,dd)
    m(ee,ff)

Так что я не могу заставить его обрабатывать текст вне скобок.Я надеялся, что кто-нибудь сможет мне помочь.

Ответы [ 3 ]

2 голосов
/ 12 марта 2019

Вы можете использовать это регулярное выражение с предвидением для разделения:

>>> s = """aa,bb,(cc,dd),m(ee,ff)"""
>>> print ( re.split(r',(?![^()]*\))', s) )
['aa', 'bb', '(cc,dd)', 'm(ee,ff)']

RegEx Demo

Информация о регулярных платежах:

  • ,: сопоставить запятую
  • (?![^()]*\)): отрицательное косвенное утверждение, которое гарантирует, что мы не сопоставляем запятую внутри (...), утверждая, что впереди нет 0 ) после 0 или более символов, не заключенных в скобки.
1 голос
/ 12 марта 2019

Попробуйте вместо этого использовать findall - повторите группу, которая соответствует ( s, за которой следуют символы не ), затем ) или соответствия не , символов:

s = """aa,bb,m(cc,dd)"""
matches = re.findall(r'(?:\([^(]+\)|[^,])+', s, re.M|re.S)
print('\n'.join(matches))

Если скорость является проблемой, вы можете сделать ее немного более эффективной, поместив ( в другой отрицательный набор символов и чередуя сначала:

(?:[^(,]+|\([^(]+\))+
0 голосов
/ 12 марта 2019

try: r ', ([^, ()] [(] [^ ()] [)] [^,] ) | ([^,] +) '

проверено на regex101: https://regex101.com/r/pJxRwQ/1

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...