문자열은 프로그래밍에서 가장 일반적으로 관련된 데이터 구조이며, 문자열을 조작해야 하는 필요성은 거의 모든 곳에서 발생합니다. 예를 들어, 문자열이 합법적인 이메일 주소인지 확인하려면 프로그래밍 방식으로 @ 전후의 하위 문자열을 추출한 다음 단어인지 도메인 이름인지 확인할 수 있지만 이는 번거로울 뿐만 아니라 재사용하기도 어렵습니다. 코드. 정규식은 문자열 일치를 위한 강력한 무기입니다. 그 디자인 아이디어는 설명적 언어를 사용하여 문자열에 대한 규칙을 정의하는 것입니다. 규칙을 준수하는 모든 문자열은 "일치"되는 것으로 간주됩니다.
따라서 문자열이 유효한지 판단하는 방법은 다음과 같습니다. 이메일은 다음과 같습니다.
이메일 공식과 일치하는 정규식 만들기 ;
이 정규 표현식을 사용하여 사용자의 입력과 일치하는지 확인하세요.
정규 표현식도 문자열로 표현되기 때문에 먼저 문자를 사용하여 문자를 설명하는 방법을 이해해야 합니다.
정규식에서는 문자를 직접 지정하면 정확히 일치합니다. 숫자와 일치하려면 d를 사용하고 문자 또는 숫자와 일치하려면 w를 사용하십시오. 따라서
'00d'는 '007'과 일치할 수 있지만 '00A'와 일치할 수는 없습니다. ' ddd'는 '010'과 일치할 수 있습니다. 'wwd'는 'py3'과 일치할 수 있습니다.
은 다음과 같습니다. ' py.'는 'pyc', 'pyo', 'py!' 등과 일치할 수 있습니다.
가변 길이 문자를 일치시키려면 정규식에서 *를 사용하여 임의 개수의 문자(0 포함)를 나타내고, +를 사용하여 하나 이상의 문자를 나타내고, ?를 사용하여 0 또는 1자를 나타냅니다. n 문자를 나타내려면 {n}, n-m 문자를 나타내려면 {n,m}을 사용합니다.
복잡한 예를 살펴보겠습니다: d{3}s+d{3,8}.
왼쪽에서 오른쪽으로 해석해 보겠습니다.
d{3}는 '010'과 같은 3개의 숫자를 일치시키는 것을 의미합니다.
s는 일치할 수 있습니다. 공백(탭 및 기타 공백 문자 포함)이므로 s+는 ' ', ' ' 등과 일치하는 최소 하나의 공백을 의미합니다.
d{3,8}은 3-8개의 숫자를 의미합니다. , 예를 들어 '1234567'입니다.
위의 정규 표현식을 종합하면 전화번호를 공백으로 구분된 지역 코드와 일치시킬 수 있습니다.
'010-12345'와 같은 숫자를 일치시키고 싶다면 어떻게 해야 할까요? '-'는 특수 문자이므로 정규식에서는 '''로 이스케이프해야 합니다. 따라서 위 정규식은 d{3}-d{3,8}입니다.
그러나 '010 - 12345'는 여전히 공백으로 인해 일치하지 않습니다. 그래서 우리는 좀 더 복잡한 매칭 방법이 필요합니다.
관련 권장 사항: "
Python 비디오 튜토리얼"
Advanced더 정확하게 일치하려면 []를 사용하여 범위를 나타낼 수 있습니다. 예:
[0-9a-zA-Z_]는 숫자, 문자 또는 밑줄과 일치할 수 있습니다. #🎜🎜 # [0-9a-zA-Z_]+는 'a100', '0_Z', 'Py3000' 등과 같이 하나 이상의 숫자, 문자 또는 밑줄로 구성된 문자열과 일치할 수 있습니다. #🎜🎜 #[a -zA-Z_][0-9a-zA-Z_]* 문자나 밑줄로 시작하는 문자열과 숫자, 문자 또는 밑줄로 구성된 문자열이 뒤따르는 문자열과 일치할 수 있습니다. 이는 Python에서 유효한 변수입니다.
[a-zA-Z_][0-9a-zA-Z_]{0, 19}는 보다 정확하게 변수 길이를 1~20자로 제한합니다(앞의 1자 + 최대 19자). 문자 이후)).
A|B는 A 또는 B와 일치할 수 있으므로 (P|p)ython은 'Python' 또는 'python'과 일치할 수 있습니다.
^은 줄의 시작을 의미하고, ^d는 숫자로 시작해야 함을 의미합니다.
$는 줄의 끝을 나타내고 d$는 숫자로 끝나야 함을 나타냅니다.
py는 'python'과도 일치할 수 있지만 ^py$를 추가하면 전체 줄과 일치하며 'py'만 일치할 수 있다는 것을 눈치채셨을 것입니다.
re 모듈준비 지식이 있으면 Python에서 정규 표현식을 사용할 수 있습니다. Python은 모든 정규식 함수를 포함하는 re 모듈을 제공합니다. Python의 문자열 자체도 이스케이프되므로 다음 사항에 특별한 주의를 기울여야 합니다.
s = 'ABC\-001' # Python의 문자열 # 해당 정규식 문자열은 다음과 같습니다: # ' ABC-001'#🎜 🎜#
따라서 Python의 r 접두어를 사용하는 것이 좋습니다. 따라서 이스케이프에 대해 걱정할 필요가 없습니다. s = r'ABC-001 ' # Python의 문자열 # 해당 정규 표현식 문자열은 변경되지 않은 상태로 유지됩니다. # 'ABC-001'
먼저 정규 표현식이 일치하는지 확인하는 방법을 살펴보겠습니다.
>>> import re >>> re.match(r'^\d{3}\-\d{3,8}$', '010-12345') <_sre.SRE_Match object; span=(0, 9), match='010-12345' >>>> re.match(r'^\d{3}\-\d{3,8}$', '010 12345') >>>
test = '사용자가 입력한 문자열'if re.match(r'regularexpression', test):
print('ok')else: print('failed')#🎜🎜 #
>>> 'a b c'.split(' ') ['a', 'b', '', '', 'c']Well , 연속된 공백은 인식되지 않습니다. 정규식을 사용해 보세요:
>>> re.split(r'\s+', 'a b c') ['a', 'b', 'c']
>>> re.split(r'[\s\,]+', 'a,b, c d') ['a', 'b', 'c', 'd']
을 시도한 다음 가입을 시도하세요. >>> re.split(r'[\s\,\;]+', 'a,b;; c d')
['a', 'b', 'c', 'd']
사용자가 일련의 태그를 입력하면 다음에 불규칙한 입력을 필터링하기 위해 정규식을 사용해야 합니다. 올바른 배열로 변환합니다.
除了简单地判断是否匹配之外,正则表达式还有提取子串的强大功能。用()表示的就是要提取的分组(Group)。比如:
^(\d{3})-(\d{3,8})$分别定义了两个组,可以直接从匹配的字符串中提取出区号和本地号码:
>>> m = re.match(r'^(\d{3})-(\d{3,8})$', '010-12345') >>> m <_sre.SRE_Match object; span=(0, 9), match='010-12345' >>>> m.group(0)'010-12345' >>> m.group(1)'010' >>> m.group(2)'12345'
如果正则表达式中定义了组,就可以在Match对象上用group()方法提取出子串来。
注意到group(0)永远是原始字符串,group(1)、group(2)……表示第1、2、……个子串。
提取子串非常有用。来看一个更凶残的例子:
>>> t = '19:05:30' >>> m = re.match(r'^(0[0-9]|1[0-9]|2[0-3]|[0-9])\:(0[0-9]|1[0-9]|2[0-9]|3[0-9]|4[0-9]|5[0-9]|[0-9])\:(0[0-9]|1[0-9]|2[0-9]|3[0-9]|4[0-9]|5[0-9]|[0-9])$', t)>>> m.groups() ('19', '05', '30')
这个正则表达式可以直接识别合法的时间。但是有些时候,用正则表达式也无法做到完全验证,比如识别日期:
'^(0[1-9]|1[0-2]|[0-9])-(0[1-9]|1[0-9]|2[0-9]|3[0-1]|[0-9])$'
对于'2-30','4-31'这样的非法日期,用正则还是识别不了,或者说写出来非常困难,这时就需要程序配合识别了。
贪婪匹配
最后需要特别指出的是,正则匹配默认是贪婪匹配,也就是匹配尽可能多的字符。举例如下,匹配出数字后面的0:
>>> re.match(r'^(\d+)(0*)$', '102300').groups() ('102300', '')
由于\d+采用贪婪匹配,直接把后面的0全部匹配了,结果0*只能匹配空字符串了。
必须让\d+采用非贪婪匹配(也就是尽可能少匹配),才能把后面的0匹配出来,加个?就可以让\d+采用非贪婪匹配:
>>> re.match(r'^(\d+?)(0*)$', '102300').groups() ('1023', '00')
编译
当我们在Python中使用正则表达式时,re模块内部会干两件事情:
编译正则表达式,如果正则表达式的字符串本身不合法,会报错;
用编译后的正则表达式去匹配字符串。
如果一个正则表达式要重复使用几千次,出于效率的考虑,我们可以预编译该正则表达式,接下来重复使用时就不需要编译这个步骤了,直接匹配:
>>> import re # 编译: >>> re_telephone = re.compile(r'^(\d{3})-(\d{3,8})$') # 使用: >>> re_telephone.match('010-12345').groups() ('010', '12345') >>> re_telephone.match('010-8086').groups() ('010', '8086')
编译后生成Regular Expression对象,由于该对象自己包含了正则表达式,所以调用对应的方法时不用给出正则字符串。
参数
修饰符
模式
위 내용은 파이썬에서 정규식을 사용하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!