점과 일치하는 정규 표현식


답변:


163

.정규식의 A 는 메타 문자이며 모든 문자를 일치시키는 데 사용됩니다. 리터럴 점과 일치하려면 이스케이프해야합니다.\.


45

정규식 에서 점 을 이스케이프"\." 하거나 문자 클래스 내에서 사용해야합니다 "[.]". 이는 정규식의 메타 문자이므로 모든 문자와 일치합니다.

또한 하나 이상의 단어 문자와 일치하는 \w+대신 필요 \w합니다.


이제 test.this콘텐츠 를 원한다면 split필요한 것이 아닙니다. split문자열을 test.this. 예를 들면 :

>>> re.split(r"\b\w+\.\w+@", s)
['blah blah blah ', 'gmail.com blah blah']

다음을 사용할 수 있습니다 re.findall.

>>> re.findall(r'\w+[.]\w+(?=@)', s)   # look ahead
['test.this']
>>> re.findall(r'(\w+[.]\w+)@', s)     # capture group
['test.this']

2
캐릭터 클래스의 경우 +1. Jenkinsfile에서 gcovr을 사용하고 도트 디렉토리를 제외하려고 시도했지만 Jenkins는 이스케이프 시퀀스를 이해하지 못합니다. 캐릭터 클래스는 아름답게 작동했습니다.
Jonathan Landrum

13

"기본 모드에서 Dot (.)은 개행을 제외한 모든 문자와 일치합니다. DOTALL 플래그가 지정되어 있으면 개행을 포함한 모든 문자와 일치합니다." (파이썬 문서)

따라서 점 리터럴을 평가하려면 대괄호 안에 넣어야한다고 생각합니다.

>>> p = re.compile(r'\b(\w+[.]\w+)')
>>> resp = p.search("blah blah blah test.this@gmail.com blah blah")
>>> resp.group()
'test.this'

1

점을 포함하여 문자열 변수의 영숫자가 아닌 문자를 이스케이프하려면 re.escape다음을 사용할 수 있습니다 .

import re

expression = 'whatever.v1.dfc'
escaped_expression = re.escape(expression)
print(escaped_expression)

산출:

whatever\.v1\.dfc

이스케이프 된 표현식을 사용하여 문자열을 문자 그대로 찾거나 일치시킬 수 있습니다.


0

자바 스크립트에서는 \를 사용해야합니다. 점과 일치합니다.

"blah.tests.zibri.org".match('test\\..*')
null

"blah.test.zibri.org".match('test\\..*')
["test.zibri.org", index: 5, input: "blah.test.zibri.org", groups: undefined]

그것은 JS가 아닌 파이썬을 요구합니다
pl-jay

-2

이 표현은

(?<=\s|^)[^.\s]+\.[^.\s]+(?=@)

특정 유형의 입력 문자열에 대해서도 정상적으로 작동 할 수 있습니다.

데모

테스트

import re

expression = r'(?<=^|\s)[^.\s]+\.[^.\s]+(?=@)'
string = '''
blah blah blah test.this@gmail.com blah blah
blah blah blah test.this @gmail.com blah blah
blah blah blah test.this.this@gmail.com blah blah
'''

matches = re.findall(expression, string)

print(matches)

산출

['test.this']

표현식을 단순화 / 수정 / 탐색하려는 경우 regex101.com의 오른쪽 상단 패널에 설명되어 있습니다. 원하는 경우이 링크 에서 일부 샘플 입력과 어떻게 일치하는지 볼 수도 있습니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.