정규 표현식 내의 변수를 사용하려면 어떻게 해야 합니까?
를 사용하고 싶습니다.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
regex를 문자열로 빌드해야 합니다.
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
텍스트에 특수 문자가 있으면 해당 문자가 해석되지 않도록 합니다.
python 3.6부터는 리터럴 문자열 보간, "f-string"도 사용할 수 있습니다.고객님의 경우 해결책은 다음과 같습니다.
if re.search(rf"\b(?=\w){TEXTO}\b(?!\w)", subject, re.IGNORECASE):
...do something
편집:
댓글에 특수 캐릭터에 대한 대처방법에 대한 질문이 몇 개 있었으므로 답변을 연장하고 싶습니다.
raw 문자열('r'):
정규 표현에서 특수 문자를 다룰 때 이해해야 하는 주요 개념 중 하나는 문자열 리터럴과 정규 표현 자체를 구분하는 것입니다.여기에서는 매우 잘 설명하고 있습니다.
요컨대:
단어 경계를 찾는 대신 이렇게 말하자.\b
끝나고TEXTO
스트링과 일치시키고 싶다.\boundary
. 다음 사항을 기입해야 합니다.
TEXTO = "Var"
subject = r"Var\boundary"
if re.search(rf"\b(?=\w){TEXTO}\\boundary(?!\w)", subject, re.IGNORECASE):
print("match")
이것은 raw-string(regex 앞에 'r'가 붙는다)을 사용하기 위해서만 동작합니다.그렇지 않으면 regex에 "\\\boundary"를 써야 합니다(4개의 백슬래시).또한 '\r'이 없으면 \b'는 더 이상 단어 경계로 변환되지 않고 백스페이스로 변환됩니다!
참조:
기본적으로 특수 캐릭터 앞에 백슬래시를 붙입니다.따라서 TEXTO에서 특수문자를 사용할 경우 다음과 같이 입력해야 합니다.
if re.search(rf"\b(?=\w){re.escape(TEXTO)}\b(?!\w)", subject, re.IGNORECASE):
print("match")
참고: 모든 버전 > = python 3.7의 경우:!
,"
,%
,'
,,
,/
,:
,;
,<
,=
,>
,@
,그리고.`
탈출하지 않습니다.정규식에 의미가 있는 특수 문자만 여전히 이스케이프됩니다. _
Python 3.3 (s)이후로 이스케이프되지 않았습니다.
물결 괄호:
f-string을 사용하여 정규 표현 내에서 수량자를 사용하려면 이중 컬리 중괄호를 사용해야 합니다.TEXTO 뒤에 정확히 두 자리 숫자를 조합한다고 가정해 보겠습니다.
if re.search(rf"\b(?=\w){re.escape(TEXTO)}\d{{2}}\b(?!\w)", subject, re.IGNORECASE):
print("match")
if re.search(r"\b(?<=\w)%s\b(?!\w)" % TEXTO, subject, re.IGNORECASE):
이렇게 하면 TEX에 있는 내용이 삽입됩니다.TO를 문자열로 정규식에 입력합니다.
rx = r'\b(?<=\w){0}\b(?!\w)'.format(TEXTO)
여러 개의 작은 패턴을 조합하여 정규 표현 패턴을 만드는 것이 매우 편리하다고 생각합니다.
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')]
이하의 경우를 제외하고, 상기의 모든 것에 동의합니다.
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
를 사용하여 다른 사용법을 시도할 수 있습니다.format
그래머 슈거:
re_genre = r'{}'.format(your_variable)
regex_pattern = re.compile(re_genre)
서로 비슷한 사용자 이름을 검색해야 했고 네드 바첼더가 말한 것이 매우 도움이 되었습니다.그러나 re.compile을 사용하여 re 검색어를 만들었을 때 보다 깔끔한 출력을 얻을 수 있었습니다.
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.
여기에 사용할 수 있는 다른 포맷이 있습니다(python 3.7에 탑재되어 있습니다).
regex_str = r'\b(?<=\w)%s\b(?!\w)'%TEXTO
수 때 이 되는 것 요.{}
서는 variable(변수)로 )%s
)
여기에는 format 키워드도 사용할 수 있습니다.형식 메서드는 {} 자리 표시자를 인수로 형식 메서드에 전달한 변수로 바꿉니다.
if re.search(r"\b(?=\w)**{}**\b(?!\w)".**format(TEXTO)**, subject, re.IGNORECASE):
# Successful match**strong text**
else:
# Match attempt failed
더 많은 예
흐름 파일이 있는 configus.yml이 있습니다.
"pattern":
- _(\d{14})_
"datetime_string":
- "%m%d%Y%H%M%f"
python 코드에서 사용
data_time_real_file=re.findall(r""+flows[flow]["pattern"][0]+"", latest_file)
언급URL : https://stackoverflow.com/questions/6930982/how-to-use-a-variable-inside-a-regular-expression
'sourcecode' 카테고리의 다른 글
테스트를 구성하기 위한 PHPUnit 베스트 프랙티스 (0) | 2022.09.11 |
---|---|
Spark java를 사용하여 mariadb에서 데이터를 읽는 방법 (0) | 2022.09.11 |
SimpleDateFormat에 대한 액세스 동기화 (0) | 2022.09.06 |
JavaScript를 사용하는 URL의 마지막 세그먼트 (0) | 2022.09.06 |
모든 정적 문자열을 한 곳에 배치하는 방법 (0) | 2022.09.06 |