2013-04-03 3 views
3

Я только начал изучать питон 2 дня назад, извините, если я сделал очевидную ошибкуразбить строку на звездочку питона

strings: "brake break at * time" --> ["at","time"] 
"strang strange I felt very *" --> ["very",""] 

Я пытаюсь получить слово до и после *

Моя попытка:

re.match(r"(?P(first_word)\w+) ('_*_') (?P(first_word)\w+)",strings).group('first_word') 

для получения первого слова

re.match(r"(?P(first_word)\w+) ('_*_') (?P(first_word)\w+)",strings).group('last_word') 

для получения не последнее слово

об ошибке: ничего повторить

+0

вы пробовали '. split ('*') ', так как это' * 'вы не хотите. – avasal

ответ

1

Просто используйте string.split('*').

Как это (работает 1 только *):

>>> s = "brake break at * time" 
>>> def my_func(s): 
    parts = s.split('*') 
    a = parts[0].split()[-1] 
    b = parts[1].split()[0] if parts[1].split() else '' 
    return a,b 
>>> my_func(s) 
('at', ' time') 

Или, если вы хотите регулярное выражение:

>>> s = "brake break at * time 123 * blah" 
>>> regex = re.compile("(\w+)\s+\*\s*(\w*)") 
# Run findall 
>>> regex.findall(s) 
[(u'at', u'time'), (u'123', u'blah')] 
+1

Да, выход - именно то, что я хочу !! Бесконечно благодарен! –

+0

Это не работает для этого примера. «Странный странный я чувствовал себя очень». -> ["very", ""] ' – ovgolovin

+0

Ваш первый пример не работает для' s = "break break at * time foo" ' – jamylak

1

Try:

[x.strip() for x in "test1 * test2".split('*', 1)] 

.strip() избавляется от пробельные и .split('*', 1) разбивает строку звездочкой один раз.

Как вы хотите только одно слово:

words = [x.strip() for x in "test1 * test2".split('*', 1)] 
first = words[0].rsplit(' ', 1)[1] 
last = words[1].split(' ', 1)[0] 
+0

Это на самом деле не работает для примеров – jamylak

+0

Это правда, спасибо, улучшил ответ. –

+0

, хотя он не дает точного результата, но спасибо за помощь! –

2
import re 
text1 = "brake break at * time" 
text2 = "strang strange I felt very *" 
compiled = re.compile(r''' 
(\w+) # one or more characters from [_0-9a-zA-Z] saved in group 1 
\s+ # one or more spaces 
\* # literal * 
\s* # zero or more spaces 
(\w*) # zero or more characters from [_0-9a-zA-Z] saved in group 2 
''',re.VERBOSE) 

def parse(text): 
    result = compiled.search(text) 
    return [result.group(1), result.group(2)] 

print(parse(text1)) 
print(parse(text2)) 

Выход:

['at', 'time'] 
['very', ''] 
+0

спасибо за комплексное решение! –

+0

IMHO это должно быть отмечено как принятый ответ, он делает именно то, что ему нужно. –

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