regex разделен низ без отчитане на интервали в кавички

string = 'protein219 Info=Acidfast Name="Mycobacterium   smegmatis" pcp=36789'

Бих искал да разделя низа, като игнорирам празните интервали между "". Използвам регулярния израз по-долу, за да разделя реда

mystring = [s for s in re.split("( |\\\".*?\\\"|'.*?')", mystring) if s.strip()] 

Което ми дава резултат като

['protein219', 'Info=Acidfast', 'Name=' , '"Mycobacterium  smegmatis"', 'pcp=','36789']

Очакван резултат:

['protein219', 'Info=Acidfast', 'Name="Mycobacterium   smegmatis"',' pcp=36789']

моля, дайте вашето предложение


person user3240059    schedule 10.02.2014    source източник
comment
@Bergi : не мисля така, тъй като SO иска да улови думата преди заедно с нея   -  person njzk2    schedule 10.02.2014


Отговори (2)


Не използвайте re.split() за това:

>>> re.findall(r'(?:"[^"]*"|[^\s"])+', string)
['protein219', 'Info=Acidfast', 'Name="Mycobacterium   smegmatis"', 'pcp=36789']

Обяснение:

(?:       # Start of non-capturing group
 "[^"]*"  # Either match a quoted string
|         # or
 [^\s"]   # anything besides spaces or quotes
)+        # End of group, match at least once
person Tim Pietzcker    schedule 10.02.2014
comment
Благодаря много Подейства - person user3240059; 10.02.2014

Имате нужда от всичко, което не съдържа интервал или интервал между кавички:

re.findall(r'[^\s]*".*"', string)

ще съответства на Name="Mycobacterium smegmatis"

re.findall(r'[^\s]+', string)

ще съответства на всички останали. Комбиниране:

re.findall(r'(?:[^\s]*".*")|(?:[^\s]+)', string)

(?: означава група без прихващане, което прави резултата обикновен списък.)

person njzk2    schedule 10.02.2014