ディレクトリ
Pythonの研究ノート--Day05
五日目、コンテンツのニーズがもう少し覚えておくので、少し難しい本当にの話。
Pythonの正規表現
Baiduの百科事典から次、正規表現が何であるかを初めて目に。正規表現も、正規表現として知られている、(正規表現、正規表現またはREと略される正規表現、コード、)、コンピュータサイエンスの概念。これは、一般的に、取得モデル(ルール)のものと行のテキストを置き換えるために使用されています。
正規表現のコンセプト
正規表現は、文字を表現するために使用され、この「ルール列」、文字列操作の論理式であり、特定の事前定義された文字の組み合わせ、及びこれらの特定の文字を使用し、「文字列ルール」を形成することです文字列フィルタ・ロジックのため。
正規表現の目的
正規表現と別の文字列を考えると、我々は、以下の目的を達成することができます:
- 所与祝福ワードは正規表現フィルタリングロジックかどうか(「マッチング」と称します)。
- はい、私たちは、正規表現で文字列から特定の部分を取得したいです。
正規表現の機能
- 柔軟性、ロジックと機能は非常に強いです。
- あなたはすぐに簡単な方法を使用して、非常に複雑な制御文字列に到達することができます。
- 新しく追加された人々のために、比較的不明瞭。
定期的なマッチングのシンボル
シンボル | 説明 | 例 | 説明 |
---|---|---|---|
。 | 任意の文字と一致 | BT | マッチバット/しかし/ B#トン/ B1Tなど |
\ワット | マッチ文字/数字/アンダースコア | B \重量 | マッチバット/ B1T / B_Tのような が、B#tを一致させることはできません |
\ sの | (\ R、\ nは、\トン、などを含む)の空白文字にマッチ | 愛\ syou | マッチはあなたを愛して |
\ dは | マッチング番号 | \ D \ dは | マッチ01/23/99など |
\ B | 単語の境界をマッチング | \ bThe \ B | |
^ | 文字列の先頭にマッチします | ^ | 文字列の先頭のマッチ |
$ | 試合終了の文字列 | .exeの$ | あなたは.EXEで終わる文字列を一致させることができます |
\ W | 非一致文字/数字/アンダースコア | B \重量 | B一致#のような/ B @トントン が、一致していませんが、/ B1T / B_Tなど |
\ S | 非空白文字をマッチング | 愛\ Syou | 愛#あなたが一致することができますし、そうで はなく、愛と一致しないことができます |
\ D | 非数値のマッチング | \ D \ D | マッチ部9a / 3#/ 0Fなど |
\ B | 非ワード境界をマッチング | \バイオ\ B | |
[] | 文字セットから任意の1文字に一致します | [AEIOU] | 任意の文字の母音にマッチします |
[^] | 文字セットにない任意の1文字に一致します | [^ AEIOU] | 非母音の文字のいずれかと一致 |
* | 0回以上一致 | \ワット* | |
+ | 1回以上一致 | \ワット+ | |
? | マッチ0または1 | \ワット? | |
{N} | マッチN回 | W \ {3} | |
{M} | 少なくともM回にマッチ | W \ {3} | |
{M、N} | ほとんどのM倍、少なくともN回のマッチング | \ W {3,6} | |
| | ブランチ | FOO |バー | あなたはFOOやバーを一致させることができます |
(?#) | 注記 | ||
(EXP) | EXPと捕捉自動的に名前付きグループに一致 | ||
(?<名前> EXP) | 経験のグループの試合とで指定された名前をキャプチャ | ||
(?:EXP) | 一致EXPが、試合のテキストをキャプチャしていません | ||
(?= EXP) | EXPの前の位置をマッチング | + W \ B \(?= INGの) | 私はダンスがdancを一致させることができますよ |
(?<= EXP) | EXPの後ろに位置をマッチング | (?<= \ bdanc)\ W + \ B | マッチI愛ダンス、最初のINGを読んで |
(?!EXP) | 後方の位置と一致しないEXP | ||
(?<!EXP) | の前に位置が一致しないEXP | ||
*? | 何回繰り返して、任意の数が、あまり重複可能な限り | 。* B 。*?B |
正規表現はaababを適用し、二つの文字列ABとAABと一致します文字列全体のaababを、一致する元 |
+? | 繰り返しの1回以上、あまり重複可能な限り | ||
?? | 繰り返し0または1が、あまり重複可能な限り | ||
{M、N}? | MにN回繰り返したが、以下のように繰り返されます | ||
{M}? | M回繰り返さ以上、あまり重複可能な限り |
正規表現のためのPythonサポート
コアの関数として、正規表現を操作するモジュールを再
機能 | 説明 |
---|---|
コンパイル(パターン、フラグ= 0) | 正規表現をコンパイルすると、正規表現オブジェクトを返します。 |
マッチ(パターン、文字列、フラグ= 0) | 正規表現一致する文字列を使用して成功したリターンマッチオブジェクトそうでない場合はなし |
search(pattern, string, flags=0) | 搜索字符串中第一次出现正则表达式的模式 成功返回匹配对象 否则返回None |
split(pattern, string, maxsplit=0, flags=0) | 用正则表达式指定的模式分隔符拆分字符串 返回列表 |
sub(pattern, repl, string, count=0, flags=0) | 用指定的字符串替换原字符串中与正则表达式匹配的模式 可以用count指定替换的次数 |
fullmatch(pattern, string, flags=0) | match函数的完全匹配(从字符串开头到结尾)版本 |
findall(pattern, string, flags=0) | 查找字符串所有与正则表达式匹配的模式 返回字符串的列表 |
finditer(pattern, string, flags=0) | 查找字符串所有与正则表达式匹配的模式 返回一个迭代器 |
purge() | 清除隐式编译的正则表达式的缓存 |
re.I / re.IGNORECASE | 忽略大小写匹配标记 |
re.M / re.MULTILINE | 多行匹配标记 |
练习
练习一:匹配正确的电话号码
#!usr/bin/python
# -*- coding: utf-8 -*-
# author: 李爽
# description:验证输入的手机号码
import re
def main():
# 验证手机号码
# 移动号码段: 139、138、137、136、135、134、150、151、152、157、158、159、182、183、187、188、147
# 联通号码段: 130、131、132、136、185、186、145
# 电信号码段: 133、153、180、189
tel = input("请输入你的电话号码:")
if tel.isdigit():
m1 = re.match(r'(13[0-9])|(14[5|7])|(15[0-3]|[7-9])|(18[023]|[5-9])/d{8}$', tel)
if not m1:
print("请输入正确的手机号")
else:
print("您的手机号为%s" % tel)
if __name__ == "__main__":
main()
练习二:替换指定内容到行尾
#!usr/bin/python
# -*- coding: utf-8 -*-
# author: 李爽
# description:正则表达式替换,从文件中读取文本,进行替换,abc后面的替换为' def'
import re
def main():
try:
with open('text.txt', 'r', encoding='utf-8') as file:
with open('text_update.txt', 'a', encoding='utf-8') as file1:
for line in file.readlines():
file1.write(re.sub(r'abc.*', 'abc def', line))
except FileNotFoundError:
print("未找到文件")
except LookupError:
print("指定了未知的编码")
except UnicodeDecodeError:
print("解码错误")
if __name__ == "__main__":
main()
text.txt
abc 123123
asd abcdea
sdfas
abcsdf1_
text_update.txt
abc def
asd abc def
sdfas
abc def
练习三:数字替换
#!usr/bin/python
# -*- coding: utf-8 -*-
# author: 李爽
# description:数字替换
# 把asdadas123asdasdas456asdasdasd789asdasd替换为:
# asdadas[123]asdasdas[456]asdasdasd[789]asdasd
import re
def main():
source_str = 'asdadas123asdasdas456asdasdasd789asdasd'
select_strs = re.findall(r'([0-9]*[0-9])', source_str)
replace_str = source_str
for select_str in select_strs:
replace_str = re.sub(select_str, '['+select_str+']', replace_str, 1)
print(replace_str)
if __name__ == "__main__":
main()
写爬虫类应用的是否,正则表达式可以大展身手,我们可以循序的从网页代码中发现我们指定的模式并提取出我们需要的信息。
结语
第五天,因为有些事情只能写这么多了。明天继续吧。
如果你发现我的文章哪里有错误或者有什么好的想法可以联系我,我们一起学习共同进步,我的邮箱地址是[email protected]
let’s do more of those!