2015-11-04 2 views
3

У меня есть последовательность строк в видеСовпадение цифры на строке с определенными условиями в питоне

s1 = "Schblaum 12324 tunguska 24 234n" 
s2 = "jacarta 331 matchika 22 234k" 
s3 = "3239 thingolee 80394 234k" 

и мне нужно отделить эти строки в двух строках, только после того, как числа на середине строки , игнорируя, если в первой части строки есть число. Что-то вроде

["Schblaum 12324", "tunguska 24 234n"] 
["jacarta 331", "matchika 22 234k"] 
["3239 thingolee 80394", "bb 6238"] 

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

finder = re.compile(""\D(\d+)\D"") 
finder.search(s1) 

безрезультатно. Есть ли способ сделать это, возможно, без использования регулярных выражений? Приветствия!

EDIT: только что нашел случай, когда исходная строка является просто

"jacarta 43453" 

без других частей. Это должно быть возвращено

["jarcata 43453"] 
+0

Потому что я сделал ошибку. Исправлена. – Ivan

+0

Я удалил [tag: pandas], поскольку в вопросе не упоминается. –

+0

Пожалуйста, отправьте решение, чтобы другие люди могли узнать из этого –

ответ

0

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

s = "Schblaum 12324 tunguska 24 234n" 
words = s.split() 
for idx, word in enumerate(words[1:], start=1): # skip the first element 
    if word.isdigit(): 
     break 
before, after = ' '.join(words[:idx+1]), \ 
       ' '.join(words[idx+1:]) 

Вы также можете использовать re.split найти пространство, и посмотреть назад 'цифру, но вам придется обрабатывать после, так как она будет разделена после первой, а также.

import re 

s3 = "3239 thingolee 80394 234k" 
result = re.split(r"(?<=\d)\s", s3, 2) # split at most twice 
if len(result) > 2: 
    before = ' '.join(result[:2]) 
else: 
    before = result[0] 
after = result[-1] 
3

Использование re.findall

>>> import re 
>>> s1 = "Schblaum 12324 tunguska 24 234n" 
>>> re.findall(r'^\S+\D*\d+|\S.*', s1) 
['Schblaum 12324', 'tunguska 24 234n'] 
>>> s2 = "jacarta 331 matchika 22 234k" 
>>> s3 = "3239 thingolee 80394 234k" 
>>> re.findall(r'^\S+\D*\d+|\S.*', s2) 
['jacarta 331', 'matchika 22 234k'] 
>>> re.findall(r'^\S+\D*\d+|\S.*', s3) 
['3239 thingolee 80394', '234k'] 
+0

Спасибо! Что произойдет, если строка не имеет второй части? Например, только «jacarta 331»? – Ivan

+0

Вы попробовали мой код? Он должен работать. 'Re.findall (r '^ \ S + \ D * \ d + | \ S. *'," jacarta 43453 ")' –

+0

Это работает, но мне пришлось сделать условие, чтобы проверить, если вторая часть списка разделов одинаково для первой части. Если это произойдет, вторая часть должна быть пустой. – Ivan

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