sourcecode

정규 표현식 내의 변수를 사용하려면 어떻게 해야 합니까?

copyscript 2022. 9. 11. 17:27
반응형

정규 표현식 내의 변수를 사용하려면 어떻게 해야 합니까?

를 사용하고 싶습니다.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

반응형