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 № 1Você 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"]