Jawaban:
Dari python 3.6 pada Anda juga dapat menggunakan Interpolasi String Literal , "f-string". Dalam kasus khusus Anda solusinya adalah:
if re.search(rf"\b(?=\w){TEXTO}\b(?!\w)", subject, re.IGNORECASE):
...do something
EDIT:
Karena ada beberapa pertanyaan dalam komentar tentang bagaimana menangani karakter khusus, saya ingin memperluas jawaban saya:
string mentah ('r'):
Salah satu konsep utama yang harus Anda pahami ketika berhadapan dengan karakter khusus dalam ekspresi reguler adalah untuk membedakan antara string literal dan ekspresi reguler itu sendiri. Dijelaskan dengan sangat baik di sini :
Pendeknya:
Katakanlah alih-alih menemukan batas kata \b
setelah TEXTO
Anda ingin mencocokkan string \boundary
. Anda harus menulis:
TEXTO = "Var"
subject = r"Var\boundary"
if re.search(rf"\b(?=\w){TEXTO}\\boundary(?!\w)", subject, re.IGNORECASE):
print("match")
Ini hanya berfungsi karena kita menggunakan string mentah (regex didahului oleh 'r'), jika tidak kita harus menulis "batas" di regex (empat garis miring terbalik). Selain itu, tanpa '\ r', \ b 'tidak akan dikonversi menjadi batas kata lagi tetapi menjadi backspace!
re.escape :
Pada dasarnya menempatkan backspace di depan karakter khusus apa pun. Karenanya, jika Anda mengharapkan karakter khusus di TEXTO, Anda perlu menulis:
if re.search(rf"\b(?=\w){re.escape(TEXTO)}\b(?!\w)", subject, re.IGNORECASE):
print("match")
CATATAN: Untuk versi> = python 3.7: !
, "
, %
, '
, ,
, /
, :
, ;
, <
, =
, >
, @
, dan `
tidak melarikan diri. Hanya karakter khusus dengan makna dalam regex yang masih lolos. _
tidak lolos sejak Python 3.3. (s. di sini )
Kurung kurawal:
Jika Anda ingin menggunakan penjumlah dalam ekspresi reguler menggunakan f-string, Anda harus menggunakan kurung kurawal ganda. Katakanlah Anda ingin mencocokkan TEXTO diikuti oleh tepat 2 digit:
if re.search(rf"\b(?=\w){re.escape(TEXTO)}\d{{2}}\b(?!\w)", subject, re.IGNORECASE):
print("match")
fr"foo{{1,5}}"
(ganda kawat gigi)
Anda harus membangun regex sebagai 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.
Perhatikan penggunaan re.escape
sehingga jika teks Anda memiliki karakter khusus, mereka tidak akan diartikan demikian.
r'' + foo + 'bar'
?
r''
tidak perlu jika Anda melakukannya re.escape(foo)
, yang seharusnya Anda lakukan. Sebenarnya, saya pikir re
menafsirkan apa pun yang diberikan sebagai string unicode terlepas dari apakah Anda awalan r
atau tidak.
if re.search(r"\b(?<=\w)%s\b(?!\w)" % TEXTO, subject, re.IGNORECASE):
Ini akan memasukkan apa yang ada di TEXTO ke dalam regex sebagai string.
rx = r'\b(?<=\w){0}\b(?!\w)'.format(TEXTO)
Saya merasa sangat nyaman untuk membangun pola ekspresi reguler dengan merangkai beberapa pola yang lebih kecil.
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)
Keluaran:
[('begin', 'id1'), ('middl', 'id2')]
Saya setuju dengan semua hal di atas kecuali:
sys.argv[1]
sesuatu seperti Chicken\d{2}-\d{2}An\s*important\s*anchor
sys.argv[1] = "Chicken\d{2}-\d{2}An\s*important\s*anchor"
Anda tidak ingin menggunakannya re.escape
, karena dalam hal ini Anda ingin berperilaku seperti regex
TEXTO = sys.argv[1]
if re.search(r"\b(?<=\w)" + TEXTO + "\b(?!\w)", subject, re.IGNORECASE):
# Successful match
else:
# Match attempt failed
Saya perlu mencari nama pengguna yang mirip satu sama lain, dan apa yang dikatakan Ned Batchelder sangat membantu. Namun, saya menemukan saya memiliki keluaran yang lebih bersih ketika saya menggunakan re.compile untuk membuat istilah pencarian ulang saya:
pattern = re.compile(r"("+username+".*):(.*?):(.*?):(.*?):(.*)"
matches = re.findall(pattern, lines)
Output dapat dicetak menggunakan yang berikut:
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.
Anda dapat mencoba penggunaan lain menggunakan format
grammer suger:
re_genre = r'{}'.format(your_variable)
regex_pattern = re.compile(re_genre)
Anda juga dapat menggunakan kata kunci format untuk metode ini. Metode keset akan menggantikan {} placeholder ke variabel yang Anda berikan ke metode format sebagai argumen.
if re.search(r"\b(?=\w)**{}**\b(?!\w)".**format(TEXTO)**, subject, re.IGNORECASE):
# Successful match**strong text**
else:
# Match attempt failed
lebih banyak contoh
Saya memiliki configus.yml dengan aliran file
"pattern":
- _(\d{14})_
"datetime_string":
- "%m%d%Y%H%M%f"
dalam kode python saya gunakan
data_time_real_file=re.findall(r""+flows[flow]["pattern"][0]+"", latest_file)