XiaobaiがPythonクローラーを学習するプロセスを記録する(2)
正規表現
特別なキャラクター
^ hはhで始まることを意味し、。は任意の文字を意味し、*は任意の回数を意味します
import re
line = 'hello 123'
#^h表示以h开头,.表示任意字符,*表示任意多次**
re_str = '^h.*'
if re.match(re_str, line):
print('匹配成功') # 输出:匹配成功
$終了文字を意味します
import re
line = 'hello 123'
re_str = '.*3$' # 前面可为任意多个任意字符,但结尾必须是3
if re.match(re_str, line):
print('匹配成功') # 输出:匹配成功
?貪欲でないモードを示します
import re
line = 'heeeello123'
re_str = '.*?(h.*?l).*' # 只要()中的子串
match_obj = re.match(re_str, line)
if match_obj:
print(match_obj.group(1)) # 输出:heeeel
# 如果去掉?,则输出:heeeell
+少なくとも1回は意味します
import re
line = 'heeeello123'
re_str = '.*(h.+?l).*'
match_obj = re.match(re_str, line)
if match_obj:
print(match_obj.group(1)) #输出:heeeel
{2}は、前の文字が2回出現することを意味します
import re
line = 'heeeello123'
re_str = '.*?(e.{2}?l).*' # 匹配的是e+任意2个字符+l
match_obj = re.match(re_str, line)
if match_obj:
print(match_obj.group(1)) # 输出:eeel
|手段または
import re
line = 'hello123'
re_str = '((hello|heeello)123)'
match_obj = re.match(re_str, line)
if match_obj:
print(match_obj.group(1)) # 输出:python123
[]は、値の範囲が1文字に指定されていることを示します
import re
line = 'hello123'
re_str = "([jhk]ello123)" # [jhk]表示jhk中的任一个都可以
match_obj = re.match(re_str, line)
if match_obj:
print(match_obj.group(1)) # 输出:hello123
[^]は非文字セットを意味します
import re
line = 'hello123'
re_str = "([^j]ello123)" # [^j]表示不是j的都行
match_obj = re.match(re_str, line)
if match_obj:
print(match_obj.group(1)) # 输出:hello123
\ sはスペースを意味します\ Sは非スペースを意味します
import re
line = 'hello123 好' #字符串有空格
re_str = "(hello123\s好)" # 匹配上空格
match_obj = re.match(re_str, line)
if match_obj:
print(match_obj.group(1)) #输出:hello123 好
[\ u4E00- \ u9FA5]は漢字を意味します
import re
line = 'hello 北京大学'
re_str = ".*?([\u4E00-\u9FA5]+大学)"
match_obj = re.match(re_str, line)
if match_obj:
print(match_obj.group(1)) # 输出:北京大学
生年月日を抽出するための小さな例
import re
line = 'xxx出生于2000年6月1日'
line = 'xxx出生于2000/6/1'
line = 'xxx出生于2000-6-1'
line = 'xxx出生于2000-06-01'
line = 'xxx出生于2000-06'
re_str = ".*出生于(\d{4}[年/-]\d{1,2}([月/-]|\d{1,2}|$))"
match_obj = re.match(re_str, line)
if match_obj:
print(match_obj.group(1))
Reライブラリの主な機能:
関数 | 説明 |
---|---|
研究() | 文字列内の正規表現の最初の位置を検索し、一致オブジェクトを返します |
再戦() | 文字列の先頭から正規表現に一致し、一致オブジェクトを返します |
re.findall() | 文字列を検索し、リストタイプで一致するすべての文字列を返します |
re.split() | 正規表現の一致結果に従って文字列を分割し、リストタイプを返します |
re.finditer() | 検索文字列、一致する結果の反復タイプを返します。各反復要素は一致オブジェクトです |
re.sub() | 文字列内の正規表現に一致するすべての部分文字列を置き換え、置き換えられた文字列を返します |
正規表現の表現タイプ:
生の文字列型(ネイティブ文字列型):
reライブラリは、次のように表される正規表現を表すために生の文字列型を使用します。r'text '
例:r' [1-9] \ d {5} '
生の文字列は、エスケープ文字を含まない文字列を参照します
文字列型はもっと面倒です。
例: '[1-9] \ d {5}'; '\ d {3}-\ d {8} | \ d {4}-\ d {7}'
当正则表达式包含转义符时,建议使用raw string类型来表示正则表达式。
再戦()
import re
ss = 'I love you, do you?'
res = re.match(r'((\w)+(\W))+',ss)
print(res.group())
I love you,
研究()
import re
ss = 'I love you, do you?'
res = re.search(r'(\w+)(,)',ss)
#print(res)
print(res.group(0))
print(res.group(1))
print(res.group(2))
you,
you
,
他の人の例を挙げないようにしましょう。
正規表現の簡単な適用
1.pingメッセージで時間の結果を探します
import re
ping_ss = 'Reply from 220.181.57.216:bytes=32 time=3ms TTL=47'
res = re.search(r'(time=)(\d+\w+)+(.)+TTL',ping_ss)
print(res.group(2))
3ms
2.Webページの解析に使用されます
import re,requests
r = requests.get('https://www.baidu.com').content.decode('utf-8')
print(r)
pt = re.compile('(\<title\>)([\S\s]+)(\<\/title\>)')
print(pt.search(r).group(2))
百度一下,你就知道
さらに、文字列の前に「r」を使用して効率を向上させることができます
pt = re.compile(r'(</title>)([\S\s]+)(</title>)')