Estou tentando extrair o texto desejado de um conjunto de texto fornecido. Criei a função abaixo.
def extract_name(title):
matches = re.findall(r'\b[A-Z0-9\s&.,()-]+(?:\s*\(\d\))?\b', title)
return ', '.join(matches) if matches else None
Mas, ele produz indesejados (, ,
para alguns títulos. Por exemplo, meus títulos são como abaixo.
THETA COMMERCIALS (2005) LIMITED, TEST CONNECTIONS LTD (In Relation), NANO CARE LIMITED (In Relation)
Resultado esperado:THETA COMMERCIALS (2005) LIMITED, TEST CONNECTIONS LTD, NANO CARE LIMITED
Em vez de usar
re.findall()
, recomendo que você usere.sub()
, para remover as partes indesejadas. Com esse padrão, você pode definir explicitamente o que deseja manter e o que não deseja manter, e pode adicionar outras alternativas para refletir isso.Neste padrão, você combina (e captura) primeiro o que você quer manter, e então combina o que você NÃO quer manter. Você substitui o que você quer manter por si mesmo (a correspondência), e você NÃO SUBSTITUI o que você NÃO quer manter, ou seja, efetivamente o que você NÃO quer manter é deletado. Regex sempre combina da esquerda para a direita, então a segunda alternativa só será correspondida se a primeira alternativa não corresponder primeiro.
PADRÃO REGEX (tipo Python):
Demonstração do Regex: https://regex101.com/r/Peu1Fw/4
CÓDIGO PYTHON (com módulo re ):
RESULTADO:
NOTAS SOBRE O PADRÃO REGEX:
(
Comece o primeiro grupo de captura(...)
, grupo 1. Referido como\1
na sequência de substituição .[ ]?
Corresponde a um caractere de espaço literal?
)\(
Correspondência literal(
\d+
Corresponda o dígito 1 ou mais vezes (+
).\)
Correspondência literal)
)
Fim do grupo 1 (\1
).|
OU em alteração ,...|...
.[ ]?
Corresponde a um caractere de espaço literal?
\(
Correspondência literal(
[^)]*
Classe de caractere negado[^...]
. Corresponde a qualquer caractere que não seja um literal)
0 ou mais vezes (*
). NOTA: Isso significa que parênteses vazios serão correspondidos e, portanto, excluídos da string atualizada.\)
Correspondência literal)
PADRÃO REGEX ATUALIZADO Este padrão atualizado remove um caractere de espaço, se houver, antes ou depois da string que queremos remover.
Por exemplo, se a string que queremos remover,
(In relation)
, estiver no início da string de teste seguida por um espaço, por exemplo(In Relation) THETA COMMERCIALS (2005) LIMITED, TEST CONNECTIONS LTD(In Relation), NANO CARE LIMITED(In Relation)
PADRÃO REGEX (tipo Python):
Demonstração do Regex: https://regex101.com/r/Peu1Fw/6
Pergunta: qual seria a melhor maneira de remover um espaço antes ou depois (não ambos) da string que queremos remover em Python ou com regex (versão Python)?
Isso requer apenas que a primeira letra seja uma letra maiúscula, número.
O meio/fim pode ser qualquer um dos caracteres de classe com dígitos opcionais entre parênteses.
https://regex101.com/r/0xVjur/1
A expressão regular alternativa substitui
\s
por espaço e tabulação na classe. E converte olimite da palavra final para também verificar se há um parêntese de fechamento final para permitir
o número final entre parênteses.
https://regex101.com/r/n83nVu/1
este funcionará, capturando qualquer letra alfabética dentro de parênteses, removendo-a do texto e eliminando quaisquer espaços depois ou antes.