/ / Encontre todas as substrings com pelo menos um grupo - regex, python-2.7

Encontre todas as substrings com pelo menos um grupo - regex, python-2.7

Eu tento encontrar em uma string toda a substring que atende a condição.

Vamos dizer que temos string:

s = "some text 1a 2a 3 xx sometext 1b yyy some text 2b."

Eu preciso aplicar o padrão de pesquisa {(um (grupo depalavras), dois (outro grupo de palavras), três (outro grupo de palavras)), palavra}. Primeiras três posições são opcionais, mas deve haver pelo menos uma delas. Se assim for, eu preciso de uma palavra depois deles. A saída deve ser:

2a  1a  3 xx
1b  yyy
2b

Eu escrevi esta expressão:

find_it = re.compile(r"((?P<one>b1as|b1bs)|" +
r"(?P<two>b2as|b2bs)|" +
r"(?P<three>b3s|b3bs))+" +
r"(?P<word>w+)?")

Cada grupo contém palavras definidas ou diferentes (não 1a, 1b). E eu não posso misturá-los em um grupo. Deve ser None se o grupo estiver vazio. Obviamente, o resultado está errado.

find_it.findall(s)
> 2a  1a  2a   3 xx
> 1b  1b    yyy

Eu sou grato pela sua ajuda!

Respostas:

0 para resposta № 1

Você pode usar o seguinte regex:

>>> reg=re.compile("((?:(?:[12][ab]|3b?)s?)+(?:w+|.))")
>>> reg.findall(s)
["1a 2a 3 xx", "1b yyy", "2b."]

Aqui eu apenas conciso seu regex usando classe de caractere e modificador ?.A regex seguinte contém 2 partes:

[12][ab]|3b?

[12][ab] corresponderá 1a,1b,2a,2b e 3b? corresponderá 3b e 3.

E se você não quer o ponto no final do 2b você pode usar o seguinte regex usando um olhar para frente que é mais geral do que o anterior regex (porque fazendo s opcional não é uma boa ideia no primeiro grupo):

>>> reg=re.compile("((?:(?:[12][ab]|3b?)s)+w+|(?:(?:[12][ab]|3b?))+(?=.|$))")
>>> reg.findall(s)
["1a 2a 3 xx", "1b yyy", "2b"]

Além disso, se seus números e substrings de exemplo são apenas instâncias que você pode usar [0-9][a-z] como um regex geral:

>>> reg=re.compile("((?:[0-9][a-z]?s)+w+|(?:[0-9][a-z]?)+(?=.|$))")
>>> reg.findall(s)
["1a 2a 3 xx", "1b yyy", "5h 9 7y examole", "2b"]