2014-05-14 8 views
3

У меня есть строка, которая выглядит как этотPython помощи регулярных выражений

24 (prem)-42-48 (6 ext)

и то, что я хочу, чтобы выйти из него является

['24 prem', '42', '48', '6 ext']

Я могу получить номера, как это:

import re 
MyString = r'24 (prem)-42-48 (6 ext)' 
Splits = re.findall(r'(\d+)', MyString) # ['24','42','48','6'] 

, но я теряю успех текст.

Я также могу это сделать:

import re 
MyString = r'24 (prem)-42-48 (6 ext)' 
Splits = re.findall(r'[\\s:\\-]', MyString) # ['24 (prem)','42', '48 (6 ext)'] 

но не попадает в (6 ext) пункт.

EDIT после просмотра ответов:

Я думаю, что, возможно, самый простой способ для меня, чтобы справиться с этим было бы разделить на номера, а затем просто использовать str.replace, чтобы избавиться от «(» и «» символов.

Итак, есть простое утверждение, регулярное выражение для разбиения строки до первого символа номера?

результат его выполнения на

'24 (prem)-42-48 (6 ext)'

будет

['24 (prem)-','42-',48 (', '6 ext)]

+1

Итак, * что такое шаблон *? Вы дали нам один вход + ожидаемая выходная линия здесь, но ничего о том, как вход может * меняться *. –

+1

Ваш последний шаблон также недействителен; эта строка кода создает '['-', '-']' и будет находить все обратные косые черты, двоеточия, тире символов '' s''. –

+2

И последнее, но не менее важное: ваш образец вывода: a) не Python, и b) невозможно с помощью обычного выражения; '['24', 'prem', '42', '48', '6 ext']' возможно, но не ''24 prem'' в качестве первого элемента. –

ответ

2

, чтобы получить этот результат, вам не нужно регэкспы, все, что вам нужно сделать, это удалить ненужные символы, заменив их пробелами и разделить строку на пробелы:

>>> s ="24 (prem)-42-48 (6 ext)" 
>>> l = s.replace('(',' ').replace('-',' ').replace('(',' ').replace(')',' ').split() 
>>> l 
['24', 'prem', '42', '48', '6', 'ext'] 

вот версия с использованием переводил Python3:

>>> s.translate(s.maketrans("()-", " ")).split() 
['24', 'prem', '42', '48', '6', 'ext'] 

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

>>> list(filter(lambda x: x is not '', re.findall('[^-() ]*', s))) 
['24', 'prem', '42', '48', '6', 'ext'] 

хотя, я, учитывая, что '24 prem' и '6 ext' в списке результатов опечатки вы сделали, в противном случае нет универсального способа сделать то, что вы хотите, но вы можете добиться этого, делая :

>>> [" ".join(l[:2])] + l[2:-2] + [" ".join(l[-2:])] 
['24 prem', '42', '48', '6 ext'] 
+0

Возможно, стоит добавить решение регулярного выражения. Похоже, он просто ищет 're.findall ([^ -()] *)'. Я думал об этом, но я не думаю, что у меня есть что-то важное, чтобы добавить –

+3

, используя str.translate (table [, deletechars]). Это лучший способ удаления нескольких символов. Пример из документов python: >>> «прочитайте этот короткий текст». Транслят («Нет», «aeiou») «rd ths shrt txt» - Я знаю, что формат прикручен, но вы надеетесь, что я надеюсь. –

+1

@GaryWalker - это 'string.translate' в Python2 и' str.translate' в Python3, но Python3 не разрешает дополнительный аргумент 'deletechars'. 'str.translate (str.maketrans (" "," ","() - "))' в Python3 –

0

Мне пришлось принять некоторые догадки о формате вашей строки, но вот регулярное выражение, которое соответствует. Обратите внимание на то, что вы подходите к «(» символ с «(» и использовать (...) для группировки

regex = re.compile(r'(\d+) \(([a-zA-Z]+)\)-(\d+)-(\d+) \((\d+) ([a-zA-Z]+)\)') 

Вы можете найти ни одного матча на линии или несколько матчей в большем блоке текста:.

>>> regex=r'(\d+) \(([a-zA-Z]+)\)-(\d+)-(\d+) \((\d+) ([a-zA-Z]+)\)' 
>>> re.findall(regex,lines) 
[('24', 'prem', '42', '48', '6', 'ext'), ('25', 'prex', '43', '48', '7', 'ext')] 
>>> regex= re.compile(r'(\d+) \(([a-zA-Z]+)\)-(\d+)-(\d+) \((\d+) ([a-zA-Z]+)\)') 
>>> line='24 (prem)-42-48 (6 ext)' 
>>> regex.match(line).groups() 
('24', 'prem', '42', '48', '6', 'ext') 
>>> lines="""24 (prem)-42-48 (6 ext) 
... 25 (prex)-43-48 (7 ext) 
... """ 
>>> regex.findall(lines) 
[('24', 'prem', '42', '48', '6', 'ext'), ('25', 'prex', '43', '48', '7', 'ext')] 
>>> 
+0

Это отлично работает на основе ввода, который я вам дал, но оказывается, что он не будет работать для извлечения данных с других входов, которые я не опубликовал. Извините за предоставление неполной проблемы. – nickvans

+0

@nickvans - без проблем. это было предназначено только в качестве отправной точки. – tdelaney

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