Respostas:
Do python 3.6 em diante, você também pode usar a Interpolação de String Literal , "f-strings". No seu caso particular, a solução seria:
if re.search(rf"\b(?=\w){TEXTO}\b(?!\w)", subject, re.IGNORECASE):
...do something
EDITAR:
Como houve algumas perguntas no comentário sobre como lidar com caracteres especiais, gostaria de estender minha resposta:
strings brutos ('r'):
Um dos principais conceitos que você precisa entender ao lidar com caracteres especiais em expressões regulares é distinguir entre literais de string e a própria expressão regular. É muito bem explicado aqui :
Em resumo:
Digamos, em vez de encontrar um limite de palavra \b
depois que TEXTO
você deseja corresponder à string \boundary
. O que você tem que escrever:
TEXTO = "Var"
subject = r"Var\boundary"
if re.search(rf"\b(?=\w){TEXTO}\\boundary(?!\w)", subject, re.IGNORECASE):
print("match")
Isso funciona apenas porque estamos usando uma string não processada (o regex é precedido por 'r'); caso contrário, devemos escrever "\\\\ limite" no regex (quatro barras invertidas). Além disso, sem '\ r', \ b 'não seria mais convertido em um limite de palavras, mas em um backspace!
re.escape :
Basicamente, coloca um backspace na frente de qualquer caractere especial. Portanto, se você espera um caractere especial em TEXTO, precisa escrever:
if re.search(rf"\b(?=\w){re.escape(TEXTO)}\b(?!\w)", subject, re.IGNORECASE):
print("match")
NOTA: Para qualquer versão> = python 3.7: !
, "
, %
, '
, ,
, /
, :
, ;
, <
, =
, >
, @
, e `
não são escapou. Somente caracteres especiais com significado em uma regex ainda são escapados. _
não é escapado desde o Python 3.3. (s. aqui )
Aparelhos encaracolados:
Se você deseja usar quantificadores dentro da expressão regular usando seqüências de f, precisará usar chaves duplas. Digamos que você queira corresponder ao TEXTO seguido por exatamente 2 dígitos:
if re.search(rf"\b(?=\w){re.escape(TEXTO)}\d{{2}}\b(?!\w)", subject, re.IGNORECASE):
print("match")
fr"foo{{1,5}}"
(double the chaves)
Você precisa criar o regex como uma string:
TEXTO = sys.argv[1]
my_regex = r"\b(?=\w)" + re.escape(TEXTO) + r"\b(?!\w)"
if re.search(my_regex, subject, re.IGNORECASE):
etc.
Observe o uso de re.escape
para que, se o seu texto tiver caracteres especiais, eles não serão interpretados como tal.
r'' + foo + 'bar'
?
r''
não é necessário se você o fizer re.escape(foo)
, o que deve ser feito de qualquer maneira. Na verdade, acho que re
interpreta o que quer que seja dado como uma string unicode, independentemente de você prefixar r
ou não.
if re.search(r"\b(?<=\w)%s\b(?!\w)" % TEXTO, subject, re.IGNORECASE):
Isto irá inserir o que está no TEXTO no regex como uma string.
rx = r'\b(?<=\w){0}\b(?!\w)'.format(TEXTO)
Acho muito conveniente criar um padrão de expressão regular unindo vários padrões menores.
import re
string = "begin:id1:tag:middl:id2:tag:id3:end"
re_str1 = r'(?<=(\S{5})):'
re_str2 = r'(id\d+):(?=tag:)'
re_pattern = re.compile(re_str1 + re_str2)
match = re_pattern.findall(string)
print(match)
Resultado:
[('begin', 'id1'), ('middl', 'id2')]
Eu concordo com todos os itens acima, a menos que:
sys.argv[1]
era algo como Chicken\d{2}-\d{2}An\s*important\s*anchor
sys.argv[1] = "Chicken\d{2}-\d{2}An\s*important\s*anchor"
você não gostaria de usar re.escape
, porque nesse caso você gostaria que ele se comportasse como uma regex
TEXTO = sys.argv[1]
if re.search(r"\b(?<=\w)" + TEXTO + "\b(?!\w)", subject, re.IGNORECASE):
# Successful match
else:
# Match attempt failed
Eu precisava procurar nomes de usuários semelhantes entre si, e o que Ned Batchelder disse foi incrivelmente útil. No entanto, descobri que tinha uma saída mais limpa quando usei re.compile para criar meu termo de pesquisa:
pattern = re.compile(r"("+username+".*):(.*?):(.*?):(.*?):(.*)"
matches = re.findall(pattern, lines)
A saída pode ser impressa usando o seguinte:
print(matches[1]) # prints one whole matching line (in this case, the first line)
print(matches[1][3]) # prints the fourth character group (established with the parentheses in the regex statement) of the first line.
você pode tentar outro uso usando a format
grammer suger:
re_genre = r'{}'.format(your_variable)
regex_pattern = re.compile(re_genre)
Você também pode usar a palavra-chave format para isso. O método Form substitui o espaço reservado {} pela variável que você passou para o método format como argumento.
if re.search(r"\b(?=\w)**{}**\b(?!\w)".**format(TEXTO)**, subject, re.IGNORECASE):
# Successful match**strong text**
else:
# Match attempt failed
mais exemplo
Eu tenho configus.yml com arquivos de fluxos
"pattern":
- _(\d{14})_
"datetime_string":
- "%m%d%Y%H%M%f"
no código python eu uso
data_time_real_file=re.findall(r""+flows[flow]["pattern"][0]+"", latest_file)