正規表現を[Pythonはベースノートを進めます]
ディレクトリ
4.1。の要件に適合するかどうかを決定するために、変数名の例
高度な使用方法の再6.(検索、findAllの、サブ、スプリット...)
文字列にマッチする正規表現で必要とされるときは、再という名前のPythonでモジュールを使用することができます。
1. reモジュール
モジュールを再利用:
#coding=utf-8
# 导入re模块
import re
# 使用match方法进行匹配操作
result = re.match(正则表达式,要匹配的字符串)
# 如果上一步匹配到数据的话,可以使用group方法来提取数据
result.group()
例えば、再モジュール(ハローマッチングステートメントで始まります)。
#coding=utf-8
import re
result = re.match(r"hello","hello python") # 'r'是防止字符转义的(转义字符无效)
result.group()
業績:こんにちは
re.match機能:
re.match試み列の開始位置が開始位置であれば成功しない、一致()戻りなしに一致するパターンに一致します。
関数のシンタックス:
re.match(pattern, string, flags=0)
パターン 正規表現マッチング ストリング 文字列マッチングに。 フラグ か否かを大文字と小文字を区別し、マルチラインマッチング等:のような正規表現マッチング方法を制御するためのフラグ。
:フラグを参照することができますhttps://www.runoob.com/python3/python3-reg-expressions.html#flags
単一の文字にマッチ2
単一文字は、正規表現にマッチします:
文字 | 機能 |
---|---|
。 | 任意の一致1つの(\ nは除く)の文字を |
[] | マッチング文字[]に記載されています |
\ dは | マッチングの数字、つまり、0-9 |
\ D | マッチング非デジタル、それが数値ではありません |
\ sの | 空白スペース、タブキーをマッチング |
\ S | マッチング非空白 |
\ワット | 単語文字、つまりAZマッチング、AZ、0-9、_ |
\ W | 非単語文字と一致 |
注意:大文字と小文字はちょうど反対の機能をマッチング文字に一致します。
3.試合複数の文字
文字形式に関連付けられています
文字 | 機能 |
---|---|
* | 一致する前の文字を不要であること、ゼロまたは無限に表示されます |
+ | 一致する前の文字が少なくとも1であること、複数回または無制限よりも見えます |
? | 直前の文字が1または0回があることを、一回またはゼロ回以上現れるマッチします |
{M} | M回文字が試合前に表示されます |
{M、N} | 一致する文字がmからに表示されますn回前に |
例1:*
需要:マッチした、大文字、小文字の文字列、およびこれらは、後に小文字不要です。
#coding=utf-8
import re
ret = re.match("[A-Z][a-z]*","M")
print(ret.group())
ret = re.match("[A-Z][a-z]*","MnnM")
print(ret.group())
ret = re.match("[A-Z][a-z]*","Aabcdef")
print(ret.group())
結果:
M
Mnn
Aabcdef
始まりの終わりにマッチ4
文字 | 機能 |
---|---|
^ | 文字列の先頭にマッチします |
$ | 文字列の末尾 |
4.1。の要件に適合するかどうかを決定するために、変数名の例
import re
def main():
names = ["age", "_age", "1age", "age1", "a_age", "age_1_", "age!", "a#123", "__________"]
for name in names:
# ret = re.match(r"[a-zA-Z_][a-zA-Z0-9_]*", name) # 有弊端,开头符合后,后面的没有强制要求判断,即不一定能判断到结尾
# ^规定开头 $规定结尾
# python中的match默认是从头开始判断的所以,在match中可以不写^,但是match不会判断结尾,所以
# 当需要以xxx结尾的时候 还需要写上$
ret = re.match(r"^[a-zA-Z_][a-zA-Z0-9_]*$", name) # 满足匹配则有返回值
if ret:
print("变量名:%s 符合要求....通过正则匹配出来的数据是:%s" % (name, ret.group()))
else:
print("变量名:%s 不符合要求...." % name)
if __name__ == "__main__":
main()
結果:
变量名:age 符合要求....通过正则匹配出来的数据是:age
变量名:_age 符合要求....通过正则匹配出来的数据是:_age
变量名:1age 不符合要求....
变量名:age1 符合要求....通过正则匹配出来的数据是:age1
变量名:a_age 符合要求....通过正则匹配出来的数据是:a_age
变量名:age_1_ 符合要求....通过正则匹配出来的数据是:age_1_
变量名:age! 不符合要求....
变量名:a#123 不符合要求....
变量名:__________ 符合要求....通过正则匹配出来的数据是:__________
試合-mailアドレスの4.2例
メールアドレス163をマッチングし、4-20文字、数字またはアンダースコアは、@記号、例えば[email protected]の前にあります。
import re
def main():
email = input("please input e-mail addres:")
# 如果在正则表达式中需要用到了某些普通的字符,比如 . 比如? 等,仅仅需要在他们前面添加一个 反斜杠进行转义
ret = re.match(r"[a-zA-Z_0-9]{4,20}@163\.com$", email)
# ret = re.match(r"[\w]{4,20}@163.com$", email) # \w会匹配中文?不行? 实测可用\w
if ret:
print("%s 符合要求." % email)
else:
print("%s 不符合要求." % email)
if __name__ == "__main__":
main()
5.マッチパケット
文字 | 機能 |
---|---|
| | 任意の式で一致について |
(AB) | パケットとして括弧内の文字(括弧内の式に一致するだけでなく、グループを表します。) |
\num |
NUMマッチした参照パケット列 |
(?P<name>) |
パケット某 |
(?P =名) | 参考パケットは、エイリアス名の文字列にマッチします |
5.1 |例:0〜100の間の数に一致します。
# coding=utf-8
# 目标:匹配出0-100之间的数字。
import re
ret = re.match("[1-9]?\d","8") # 这样写匹配不到100(三位数),匹配不了结尾
print(ret.group()) # 8
ret = re.match("[1-9]?\d","78")
print(ret.group()) # 78
# 不正确的情况
ret = re.match("[1-9]?\d","08")
print(ret.group()) # 0 ,?匹配前一个字符出现1次或者0次,本处出现0次,符合匹配。为什么返回的是0而不是08?
# 修正之后的
ret = re.match("[1-9]?\d$","08") # 还是匹配不到100(三位数)
if ret:
print(ret.group())
else:
print("不在0-100之间")
# 添加|
ret = re.match("[1-9]?\d$|100","8")
print(ret.group()) # 8
ret = re.match("[1-9]?\d$|100","78")
print(ret.group()) # 78
ret = re.match("[1-9]?\d$|100","08")
# print(ret.group()) # 不是0-100之间
ret = re.match("[1-9]?\d$|100","100")
print(ret.group()) # 100
5.2()例:
1)163126、QQメールをマッチング
import re
ret = re.match("\w{4,20}@163\.com", "[email protected]")
# \w匹配单词字符,即a-z、A-Z、0-9、_ ,此处匹配@符号之前有4到20位 英文字母、数字或下划线
print(ret.group()) # [email protected]
ret = re.match("\w{4,20}@(163|126|qq)\.com", "[email protected]") # |匹配左右任意一个表达式
print(ret.group()) # [email protected]
ret = re.match("\w{4,20}@(163|126|qq)\.com", "[email protected]")
print(ret.group()) # [email protected]
ret = re.match("\w{4,20}@(163|126|qq)\.com", "[email protected]") # 不匹配时无返回
if ret:
print(ret.group())
else:
print("不是163、126、qq邮箱") # 不是163、126、qq邮箱
結果:
[email protected]
[email protected]
[email protected]
不是163、126、qq邮箱
2)抽出の市外局番と電話番号
import re
ret = re.match("([^-]*)-(\d+)","010-12345678")
# [^-]匹配除了-外的字符;*匹配前一个字符出现0次或者无限次;+匹配\d(数字)1次或者无限次
print(ret.group()) # 010-12345678
print(ret.group(1)) # 010
print(ret.group(2)) # 12345678
注:[^ ...]:マッチ[]は文字ではありません。
例えば:[^ ABC]、B、Cの文字にマッチすることに加えて、[^ - ]マッチングに加えて - 外部文字。
5.3 \例
\のNum例:
要件:マッチ<html><h1>hello</h1></html
import re
labels = ["<html><h1>hello</h1></html>", "<html><h1>hello</h2></html>"]
for label in labels:
ret = re.match(r"<(\w*)><(\w*)>.*</\2></\1>", label)
if ret:
print("%s 是符合要求的标签" % ret.group())
else:
print("%s 不符合要求" % label)
注:正则表达式内,第一个()是分组1,用\1匹配;第2个()是分组2,用\2匹配。
出力:
<html><h1>hello</h1></html> 是符合要求的标签
<html><h1>hello</h2></html> 不符合要求
注:\ num個の参照パケットNUMマッチした文字列。)正規表現、最初の(内マッチング\で、パケット1であり、2の()\ 2マッチを有するパケット2、です。
5.4。 (?P<name>)
(?P=name)实例
(?P <名前>)パケット別名、(?P =名)基準パケットは、エイリアス名の文字列と一致します。
要件:マッチ<html><h1>hello</h1></html>
#coding=utf-8
import re
ret = re.match(r"<(?P<name1>\w*)><(?P<name2>\w*)>.*</(?P=name2)></(?P=name1)>", "<html><h1>hello</h1></html>")
print(ret.group()) # <html><h1>hello</h1></html>
ret = re.match(r"<(?P<name1>\w*)><(?P<name2>\w*)>.*</(?P=name2)></(?P=name1)>", "<html><h1>hello</h2></html>")
# print(ret.group()) # 不匹配,异常
?説明:( P <NAME1> \ * W)NAME1エイリアスパケットに、パケットマッチは\ 0回または無限;? W(P = NAME1)NAME1基準パケットは、エイリアス文字列と一致します。
高度な使用方法の再6.(検索、findAllの、サブ、スプリット...)
6.1。探す
文字列全体スキャンre.search 戻り最初に成功したマッチ:re.search(パターン、文字列、フラグ= 0)
Re.search方法は、一致の成功、それ以外の場合はなしに一致するオブジェクトを返します。
我々は、一致するオブジェクト整合発現を得るためにグループ(数値)またはグループ()関数を使用することができます。
re.match一致文字列の先頭にのみ、文字列はマッチが失敗し、正規表現を開始するために準拠していない場合、関数から復帰なし、とre.searchそれが一致するものが見つかるまで、文字列全体に一致します。
例:記事が読みた回数に一致します。
# coding=utf-8
import re
ret = re.search(r"\d+", "阅读次数为 9999")
print(ret.group()) # 9999
6.2。findAll
文字列式で発見され一致するすべてのサブ文字列を、と返し、リストを一致が見つからない場合は、空のリストが返されます。
(注: マッチと検索が試合はすべてに一致するのfindAllです。)
re.findall(string[, pos[, endpos]])
- マッチする文字列。
- POSオプションのパラメータは、文字列の開始位置が、デフォルトは0であることを指定します。
- endposの文字列、文字列の長さのデフォルトの終了位置を指定するオプションのパラメータ。
例:パイソン、C、C ++の数の統計は記事を読むこと
#coding=utf-8
import re
ret = re.findall(r"\d+", "python = 9999, c = 7890, c++ = 12345")
print(ret) # ['9999', '7890', '12345']
注:戻り値がリストである、ないグループ。
6.3。サブ
Pythonのreモジュールが提供re.subの置換文字列の一致を。
re.sub(pattern, repl, string, count=0, flags=0)
- パターン:通常のパターン文字列インチ
- REPL:文字列を置換、それは関数であってもよいです。
- 文字列:元の文字列を交換する見つけます。
- パターンマッチングの置換の最大数を、すべての出現を置き換えるために、0の手段をデフォルト:カウント。
- フラグ:デジタル形式でコンパイル時に対するパターン、。
最初の3つの必須パラメータ二つのオプションのパラメータです。
簡単に言えば:反発にパターンと文字列マッチング、マッチング結果を取り、その後、置き換える文字列全体が返されます。
例:読むマッチした番号がインクリメントされます。
# coding=utf-8
import re
ret = re.sub(r"\d+", '998', "python = 997")
print(ret) # python = 998
REPLは、関数に置き換え:
# coding=utf-8
import re
def add(temp):
strNum = temp.group() # 取出匹配到的值
num = int(strNum) + 1
return str(num)
ret = re.sub(r"\d+", add, "python = 997") # 匹配到了,则调add函数(匹配出来的对象传给函数),函数返回值用来替换
print(ret) # python = 998
ret = re.sub(r"\d+", add, "python = 99")
print(ret) # python = 100
例:次のテキスト文字列から削除
<div> <P>技術要件:</ p型>
<P-> 1、一年以上のPythonの開発経験、オブジェクト指向分析設計の把握、デザインパターンの理解</ p型>
<P-> 2、MVCに精通HTTPプロトコルを習得します、MVVMの概念と</ P->関連するWeb開発フレームワーク
<P-> 3、リレーショナルデータベースの設計、マスターSQLの開発を把握し、<BR> </ P->でのMySQL / PostgreSQLの熟練使用
<P-> 4、マスターのNoSQL </ P>熟練対応する技術的な解決策使用して、MQ、
。<P> 5、おなじみのJavascript / CSS / HTML5、jQueryの、反応して、Vue.js </ P>
<BR> </ P> </; <P>&NBSPをDIV>
# coding=utf-8
import re
string =r"<div><p>技术要求:</p><p>1、一年以上 Python 开发经验,掌握面向对象分析和设计,了解设计模式</p><p>2、掌握HTTP协议,熟悉MVC、MVVM等概念以及相关WEB开发框架</p><p>3、掌握关系数据库开发设计,掌握 SQL,熟练使用 MySQL/PostgreSQL 中的一种<br></p><p>4、掌握NoSQL、MQ,熟练使用对应技术解决方案</p><p>5、熟悉 Javascript/CSS/HTML5,JQuery、React、Vue.js</p><p> <br></p></div>"
ret = re.sub(r"<[^>]*>| |\n", "", string)
# [^>]*匹配除了>之外的字符,<[^>]*>即匹配<...>。总体匹配<...>、空格、换行
print(ret)
注:...
6.4スプリット
一致する文字列を切断し、リストを返します。すなわち、分割文字列の後にサブシーケンスをマッチングのリストができリターンするように。
re.split(pattern, string[, maxsplit=0, flags=0])
- パターン:正規表現に一致します。
- 文字列:一致する文字列。
- maxsplit個:パーティション番号、maxsplit個= 1分離後、デフォルトは0であり、数は限定されるものではありません。
- フラグ:いるか否か、大文字と小文字を区別し、マルチラインマッチング等:のような正規表現マッチング方法を制御するためのフラグ。
例:および(スペース)文字列「INFO:xiaoZhang 33山東」を切断:に従って
# coding=utf-8
import re
ret = re.split(r":| ","info:xiaoZhang 33 shandong")
print(ret) # ['info', 'xiaoZhang', '33', 'shandong']
もっとルーキーのチュートリアルを参照してください可能性がありますhttps://www.runoob.com/python3/python3-reg-expressions.html#flags
- - - - - 終わり - - - - - - -