python 3 의 정규 모듈
정규 와 가장 관련 된 것 은 문자열 이 라 고 할 수 있 지만 내 장 된 py 의 str 형식 에는 내 장 된 정규 방법 이 없습니다. str 의 기본 적 인 방법 을 살 펴 볼 수 있 습 니 다. 저 는 가장 유용 하 다 고 생각 합 니 다. find, len, split, join 이 네 가지 방법 이 라 고 할 수 있 습 니 다. 그러나 문자열 조작 에 있어 서 이것 은 정말 too simple 입 니 다. 그래서 py 는 우리 에 게 Re 모듈 을 제공 합 니 다.정규 문자열 을 사용 하여 관련 작업 을 할 수 있 도록 도 와 줍 니 다. 또한, py 의 정규 규칙 은 perl - like 이기 때문에 지원 하 는 정규 기능 은 js 보다 훨씬 많 습 니 다.
Re 사용
우선 정규 모듈 을 가 져 와 야 합 니 다.
import re
우 리 는
dir(re)
을 사용 하여 그 안에 주로 어떤 방법 이 있 는 지 볼 수 있 습 니 다. 또는 python 홈 페이지 를 직접 찾 아 볼 수 있 습 니 다. 그러면 우 리 는 관련 정규 방법 을 사용 할 수 있 습 니 다. 정식 사용 방법 전에 py 에 정규 규칙 을 쓰 는 것 을 배 워 야 합 니 다. py 는 다른 언어 //
(slashes) 를 정규 식별 자로 사용 하 는 것 과 다 르 기 때문에 py 사용 r
정규 표현 식 flag.# js
/\d+/
# py
r"\d+"
다음은 re 모듈 을 소개 하 는 동시에 python 의 정규 문법 을 간단하게 설명 하 겠 습 니 다.
match
match 는 string 에서 pattern 에 일치 하 는 부분 을 찾 는 데 사 용 됩 니 다. 기본 syntax:
re.match(pattern, string, flags=0)
reg = re.match(r"\w", "wa");
# flag: re.I ->
reg = re.match(r"\w", "wa",re.I);
만약 일치 하 게 된다 면, 우 리 는 어떻게 안에서 우리 가 원 하 는 것 을 얻 을 수 있 습 니까?간단 합 니 다: match object 위 에 두 가지 방법 이 있 습 니 다: group 과 groups
0
모든 일치 하 는 내용 을 되 돌려 줍 니 다. 1 부터 (...)
를 통 해 일치 하 는 내용 (...)
를 통 해 일치 하 는 모든 하위 내용 을 되 돌려 주 고 tuple 에 넣 습 니 다. reg = re.match(r"\w", "w1a",re.I);
print(reg.group(0)) # w
reg = re.match(r"\b\w*\b(\s\b\w*\b)", "Cats are smarter than dogs");
print(reg.group(0)) # Cats are
print(reg.group(1)) # are
print(reg.groups()) # (' are',)
또 하나의 상용 방법 은 search 입 니 다. 현재 그 와 match 의 차이 가 어디 에 있 는 지 모 르 겠 습 니 다.
search
search 방법 은 첫 번 째 정규 에 맞 는 str 내용 을 찾 는 데 사 용 됩 니 다. 마찬가지 로 일치 하면 match Object 로 돌아 갑 니 다. 일치 하지 않 으 면 None 으로 돌아 갑 니 다. 따라서 그의 match 방법 은 위 와 같 습 니 다.
하지만 실제로는 차이 가 있다.공식 소개 에 따 르 면 match 는 string 의 시작 부분 부터 만 일치 할 수 있 고 search 는 모든 위치 에서 부터 일치 할 수 있 습 니 다. 다음 과 같 습 니 다.
r"^xxxx"
소스 입 니 다. /\w+/g
전역 과 유사 합 니 다. search = re.search(r"123", "aresmarter12323handogs");
match = re.match(r"123", "aresmarter12323handogs")
print(search.group()) # Cats are
print(match.group()) # AttributeError
match 를 사용 하면 이 점 이 어색 합 니 다.
sub
이 방법 은 일치 하 는 str 부분 을 지정 한 문자열 로 대체 하 는 것 입 니 다. 실제로 python 의 replace 방법 과 같 습 니 다. 다만 그 는 정규 로 일치 하 는 것 입 니 다: syntax:
re.sub(pattern, repl, string, max=0)
reg = re.sub(r"\d+","", "remove digital from xxx123xxx123xx");
print(reg) # remove digital from xxxxxxxx
reg = re.sub(r"\d+","", "remove digital from xxx123xxx123xx",1);
print(reg) # remove digital from xxxxxx123xx
compile
이것 은 python 이 제공 하 는 parse regexp 방법 함수 입 니 다. 사실은 더 좋 은 정규 를 재 활용 하기 위해 서 입 니 다. 예 를 들 어 저 는 정규 가 있 습 니 다. 하지만 여러 번 사용 하고 싶 으 면 copile 이 없 는 상태 에서 copy 만 할 수 있 습 니 다. 이것 은 실제 자바 script 의 RegExp 대상 과 일리 가 있 습 니 다. 그리고 이 방법 에 마 운 트 되 어 있 습 니 다. 모든 정규 에 의존 하 는 방법, 즉,pattern 을 입력 해 야 하 는 곳 은 dot 를 직접 사용 하여 호출 할 수 있 습 니 다. 기본 형식 은:
re.compile(pattern, flags=0)
데모 보 세 요.
getDigital = re.compile(r'\d+',re.I)
a_str = 'remove digital from xxxxxx123xx'
removeDigital = getDigital.sub('',a_str)
print(removeDigital) # remove digital from xxxxxxxx
상황 을 봐 서 쓰 세 요.
findall
위의 match 와 search 부터 필요 하 다 고 생각 합 니 다. findall 은 match 와 search 보다 이 방법 이 더 흔 하기 때 문 입 니 다. 사용 빈도 에 따라 정렬 할 수 있 습 니 다.
findall 의 역할 은 전역 일치 입 니 다. 형식 은:
re.findall(pattern, string, flags=0)
그 가 돌아 온 내용 은 match object 가 아니 라 list 입 니 다. 전체 string 에서 pattern 에 맞 는 내용 을 표시 합 니 다. (match 와 차이 가 별로 없 음) demo 를 보 세 요.
get_digital = re.findall(r'\d+',"123 I am a space 13123")
print(get_digital) # ['123', '13123']
fullmatch
fullmatch 는 정규 와 string 이 완전히 일치 하 는 관 계 를 나타 내 는 데 사 용 됩 니 다. 처음부터 끝까지 일치 하면 관련 내용 을 되 돌려 줍 니 다. 그렇지 않 으 면 None. fullmatch 는
r"\A your regular expression \Z"
에 해당 합 니 다. ^
대체 \A
를 사용 할 수 있 습 니 다. $
대체 \Z
형식 은 다음 과 같 습 니 다.fullmatch(pattern, string, flags=0)
데모 보기:
get_digital = re.fullmatch(r'\d{3,11}',"331213322")
same_effect = re.match(r'^\d{3,11}$',"331213322")
print(get_digital.group()) # fullmatch
print(same_effect.group()) # \A \Z
split
str 의 split 방법 에 비해 그의 역할 은 정규 와 일치 하 는 것 입 니 다. 돌아 오 는 것 은 list 입 니 다. 형식 은:
split(pattern, string, maxsplit=0, flags=0)
데모 보 세 요.
split_str = re.split(r'\d','this is 1 this is 2')
print(split_str) # ['this is ', ' this is ', '']
마지막 으로 에 스 케 이 프 방법 을 소개 합 니 다. 악성 문 자 를 처리 하 는 데 자주 사 용 됩 니 다.
escape
다른 문 자 를 걸 러 내 는 데 사용 할 때 ASCII 와 숫자 만 유지 합 니 다. (v 3.3 버 전에 서 지원
_
하지만 지금 은 지원 되 지 않 습 니 다.) 그의 반환 값 은 새로운 str 입 니 다. 형식 은:escape(string)
데모 보기:
esc = re.escape('I"m a evil window.location.href="villainhr.com" ')
print(esc) # \ .
# I\"m\ a\ evil\ \\ window\.location\.href\=\"villainhr\.com\"\<\/script\></code></pre>
<p> , , match object .</p>
<h2>Match Object</h2>
<p>match object match search . , MO(match object) , group() groups(). , , MO 。</p>
<ul>
<li><p>start([group]): group str . Number。</p></li>
</ul>
<pre><code>reg = re.match(r"\w+\d+(\w+)", "first1232second");
print(reg.group(1),'start from',reg.start(1)) # second start from 9</code></pre>
<ul>
<li><p>end([group]): start , group .</p></li>
</ul>
<pre><code>reg = re.match(r"\w+\d+(\w+)", "first1232second");
print(reg.group(1),'end up with',reg.end(1)) # second end up with 15</code></pre>
<p> start end .</p>
<ul>
<li>
<ul>
<li><p> :( , index 2,index 1 )</p></li>
</ul></li>
</ul>
<pre><code>exa = "first1232second third"
reg = re.search(r"\d+(\w+)\s(\w+)", exa);
print(exa[:reg.start(2)]) # first1232second </code></pre>
<ul>
<li>
<ul>
<li><p> :</p></li>
</ul></li>
</ul>
<pre><code>exa = "first1232second , third"
reg = re.search(r"\d+(\w+)\s[/'',.]\s(\w+)", exa);
print(exa[reg.end(1):reg.start(2)]) # , </code></pre>
<p> , .</p>
<ul>
<li><p>span([group]): group str .</p></li>
</ul>
<pre><code>reg = re.match(r"\w+\d+(\w+)", "first1232second");
print(reg.group(1),'its span is',reg.span(1)) #
# second its span is (9, 15)</code></pre>
<ul>
<li><p>lastindex: index. , None. lastindex ( +1 )</p></li>
</ul>
<pre><code>reg = re.search(r"\d+(\w+)", "first1232second");
print(reg.lastindex) # 1</code></pre>
<ul>
<li><p>lastgroup: . , . demo:</p></li>
</ul>
<pre><code>exa = "first1232second , third third"
reg = re.search(r"\d+(?P<name>\w+)\s[/'',.]\s(?P<sam>\w+)\s", exa);
print(reg.lastgroup) # sam</code></pre>
<p> python , (?P< xxx>) . , lastgroup , .<br> , re , MO .</p>
<p> , flags ( group)</p>
<h2>regexp supplement</h2>
<h3> </h3>
<p> , , x . , sub , group .</p>
<p> , group .<br> <code>
umber</code> , <code>(?P<xxx>)</code>。 , group , . <br>Old style:</p>
<pre><code>exa = "first1232second , third"
reg = re.search(r"\d+(\w+)", exa);
print(reg.group(1))</code></pre>
<p> 1 , , , group(0) .<br> , group . <br>New style:</p>
<pre><code>exa = "my id is 12334213"
reg = re.search(r"(?P<id>\d+)", exa);
print(reg.group('id'))</code></pre>
<p> , , . .</p>
<p> , sub , HTML .<br> demo :</p>
<pre><code>exa = '<text top="33" font="0"><b>test</b></text>'
new_text = re.sub(r"<b>(.*?)</b>", r'\1',exa);
print(new_text)</code></pre>
<p> , :</p>
<pre><code>exa = '<text top="33" font="0"><b>test</b></text>'
new_text = re.sub(r"<b>(?P<innerHTML>.*?)</b>", r'\g<innerHTML>',exa);
print(new_text)</code></pre>
<p> .</p>
<p> , re flag</p>
<h3>flag</h3>
<p> :</p>
<table>
<thead>
<tr>
<th align="left">name</th>
<th align="left">effect</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">re.I</td>
<td align="left"> </td>
</tr>
<tr>
<td align="left">re.M</td>
<td align="left"> . ,<code>^</code> <code>$</code> str , . re.M flag , , str <code>^...$</code> </td>
</tr>
<tr>
<td align="left">re.S</td>
<td align="left"> flag <code>.</code> . <code>.</code> , . , flag , <code>.</code> </td>
</tr>
<tr>
<td align="left">re.X</td>
<td align="left"> regexp. , comment , , . ,regexp , <code>\s</code> </td>
</tr>
</tbody>
</table>
<p> demo, re.X .</p>
<pre><code>a = re.compile(r"""\d + # the integral part
\. # the decimal point
\d * # some fractional digits""", re.X)
b = re.compile(r"\d+\.\d*")
# a b</code></pre>
<p> demo, .</p>
<p> , .</p>
<p><span class="img-wrap"></span></p>
</div>
</div>
</div>
</div>
<!--PC WAP -->
<div id="SOHUCS" sid="1175672698227994624"></div>
<script type="text/javascript" src="/views/front/js/chanyan.js">
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
단순 코드 1from bs4 import BeautifulSoup def getHtml(url): import urllib import urllib.request print("第二种方法") request = urllib.requ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.