Как использовать формат регулярных выражений без захвата групп в Python - PullRequest
0 голосов
/ 18 мая 2018

В следующем коде я хочу получить только цифры между '-' и 'u'.Я думал, что смогу применить формат не захватывающих групп регулярных выражений (?:…), Чтобы игнорировать все, начиная с '-' и заканчивая первой цифрой.Но вывод всегда включать это.Как я могу использовать формат групп без захвата для генерации правильного вывода?

df = pd.DataFrame(
    {'a' : [1,2,3,4], 
     'b' : ['41u -428u', '31u - 68u', '11u - 58u', '21u - 318u']
    })

df['b'].str.extract('((?:-[ ]*)[0-9]*)', expand=True)

enter image description here enter image description here

Ответы [ 2 ]

0 голосов
/ 18 мая 2018

Он не включен во внутреннюю группу, но все еще включен как часть внешней группы.Не захватывающая группа не обязательно подразумевает, что она вообще не захвачена ... просто эта группа явно не сохраняется в выходных данных.Это все еще захвачено как часть любых вмещающих групп.

Только не помещайте их в (), который определяет захват:

import pandas as pd

df = pd.DataFrame(
    {'a' : [1,2,3,4], 
     'b' : ['41u -428u', '31u - 68u', '11u - 58u', '21u - 318u']
    })

df['b'].str.extract(r'- ?(\d+)u', expand=True)

     0
0  428
1   68
2   58
3  318

Таким образом, вы сопоставляете все, что имеет '-' впереди (mabye, сопровождаемый пробелом), 'u' сзади и числа между ними.

Где,

-      # literal hyphen
\s?    # optional space—or you could go with \s* if you expect more than one
(\d+)  # capture one or more digits 
u      # literal "u"
0 голосов
/ 18 мая 2018

Я думаю, вы пытаетесь слишком сложное регулярное выражение.Как насчет:

df['b'].str.extract(r'-(.*)u', expand=True)

      0
0   428
1    68
2    58
3   318
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...