web-dev-qa-db-ja.com

正規表現内で変数を使用する方法は?

variable内でregexを使用したいのですが、どうすればPythonでこれを行うことができますか?

TEXTO = sys.argv[1]

if re.search(r"\b(?=\w)TEXTO\b(?!\w)", subject, re.IGNORECASE):
    # Successful match
else:
    # Match attempt failed
176
Pedro Lobito

文字列として正規表現を作成する必要があります。

TEXTO = sys.argv[1]
my_regex = r"\b(?=\w)" + re.escape(TEXTO) + r"\b(?!\w)"

if re.search(my_regex, subject, re.IGNORECASE):
    etc.

re.escapeの使用に注意してください。これにより、テキストに特殊文字が含まれている場合、そのように解釈されないようになります。

237
Ned Batchelder
if re.search(r"\b(?<=\w)%s\b(?!\w)" % TEXTO, subject, re.IGNORECASE):

これにより、TEXTOにあるものが文字列として正規表現に挿入されます。

40
Bo Buchanan
rx = r'\b(?<=\w){0}\b(?!\w)'.format(TEXTO)
31
Cat Plus Plus

複数の小さなパターンをつなぎ合わせて正規表現パターンを作成すると非常に便利です。

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)

出力:

[('begin', 'id1'), ('middl', 'id2')]
4

次の場合を除き、上記すべてに同意します。

sys.argv[1]Chicken\d{2}-\d{2}An\s*important\s*anchorのようなものでした

sys.argv[1] = "Chicken\d{2}-\d{2}An\s*important\s*anchor"

re.escapeは使用したくないでしょう。その場合、正規表現のように振る舞うようにしたいからです。

TEXTO = sys.argv[1]

if re.search(r"\b(?<=\w)" + TEXTO + "\b(?!\w)", subject, re.IGNORECASE):
    # Successful match
else:
    # Match attempt failed
3
Max Carroll

python 3.6以降では、 Literal String Interpolation 、 "f-strings"も使用できます。特定の場合の解決策は次のとおりです。

if re.search(rf"\b(?=\w){TEXTO}\b(?!\w)", subject, re.IGNORECASE):
    ...do something
2
airborne

互いに類似したユーザー名を検索する必要がありましたが、Ned Batchelderが言ったことは非常に役に立ちました。ただし、re.compileを使用して再検索用語を作成すると、出力がよりきれいになりました。

pattern = re.compile(r"("+username+".*):(.*?):(.*?):(.*?):(.*)"
matches = re.findall(pattern, lines)

出力は次を使用して印刷できます。

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.
2
jdelaporte

format grammer sugerを使用して別の使用法を試すことができます。

re_genre = r'{}'.format(your_variable)
regex_pattern = re.compile(re_genre)  
1
Kevin Chou

これにはformatキーワードも使用できます。Formatメソッドは、{}プレースホルダーをformatメソッドに引数として渡した変数に置き換えます。

if re.search(r"\b(?=\w)**{}**\b(?!\w)".**format(TEXTO)**, subject, re.IGNORECASE):
    # Successful match**strong text**
else:
    # Match attempt failed
0
Haneef Mohammed