Или условие для литеральной строки в выражении регулярного выражения

1

У меня есть следующее выражение регулярного выражения

re.findall('\(([0-9].*?)\)', a[a.find('('):].strip())

для строк, таких как

asdasdasd (21345-asdasdasd)

чтобы получить то, что находится внутри скобок, а затем число. Но я также хочу быть в состоянии получить то, что внутри, за которым следует строка "NA", например:

asdasdasd (NA-asdasdasd)

Я пробовал:

re.findall('\(([0-9].*?)\)|\((NA.*?)\)', a[a.find('('):].strip())

но создает кортеж. Как это будет? Заранее спасибо!

  • 1
    Попробуйте \((?:\d|NA)[^()]*\)
  • 0
    Итак, удалите захватывающие скобки. Или используйте re.findall(r'\(((?:[0-9]+|NA)-[^)]*)\)', a)
Показать ещё 3 комментария
Теги:
python-2.7

1 ответ

0

Вы можете захватить подстроку между круглыми скобками, когда текст внутри начинается с цифр /NA за которыми следуют - и любых других символов, кроме ( и ) используя

re.findall(r'\(((?:[0-9]+|NA)-[^)]*)\)', a)

См. Демо-версию regex.

подробности

  • \( - a (
  • ((?:[0-9]+|NA)-[^)]*) - Захват группы (это значение будет возвращено re.findall):
    • (?:[0-9]+|NA) - 1 или более цифр или NA
    • - - дефис
    • [^)]* - 0+ символы кроме )
  • \) - a ) char.

См. Демонстрацию Python:

import re
strs = ['asdasdasd (21345-asdasdasd)', 'asdasdasd (NA-asdasdasd)']
for s in strs:
    print(re.findall(r'\(((?:[0-9]+|NA)-[^)]*)\)', s))

Выход:

['21345-asdasdasd']
['NA-asdasdasd']

Ещё вопросы

Сообщество Overcoder
Наверх
Меню