正規表現には、データの有効性の検証、要件を満たすテキストの検索、テキストの切り取りと置換という 3 つの一般的な機能があります。
1. メタキャラクター
いわゆるメタキャラクターは、正規表現において特別な意味を持つ特殊文字を指します。
メタキャラクターは、単一の特殊文字を表すもの、空白を表すもの、特定の範囲を表すもの、時間を表すもの、アサーションを表すものに大まかに分類されます。
1.1 特殊な単一文字
英語のドット (.) は改行以外の任意の 1 文字を表し、\d は任意の 1 桁を表し、\w は任意の 1 桁の数字または文字またはアンダースコアを表し、\s は任意の 1 つの空白文字を表します。さらに、対応する \D、\W、\S が 3 つあり、それぞれ元の意味とは反対の意味を表します。
import re
#匹配所有数字
txt = "123d5sdf23"
result = re.findall('\d', txt)
print(result)
#输出:['1', '2', '3', '5', '2', '3']
#匹配所有的数字、字母和下划线
txt = 'sdfw234_sdf12'
result = re.findall('\w', txt)
print(result)
#输出:['s', 'd', 'f', 'w', '2', '3', '4', '_', 's', 'd', 'f', '1', '2']
1.2. 空白文字
システムが異なれば、テキストの各行の終わりにあるデフォルトの「改行」も異なります。たとえば、Windows では \r\n、Linux と MacOS では \n です。
\r キャリッジリターン文字
\n 改行文字
\f フォームフィード文字
\t タブ文字
\v 垂直タブ文字
\s 任意の空白文字
#获取每一行的开头
f = open('hello.txt', 'r', encoding='utf-8')
txt = f.read()
print(txt)
#输出:
#小明
#小红
#小月
result = re.findall('\n\w*', txt)
print(result)
#输入:['\n小红', '\n小月']
1.3. 数量子
正規表現では、英語のアスタリスク (*) は 0 から複数の出現を表し、プラス記号 (+) は 1 から複数の出現を表し、疑問符 (?) は 0 から 1 の出現を表し、{m,n} は m から n を表します。出来事。
※:0~複数回
+:1~複数回
?:0~1回
{m}: m 回出現します
{m,}: 少なくとも m 回出現します
{m,n}: m 回から n 回まで
#寻找3个数字组合
txt = '123 1 sfd 2342 aa 23g 342'
result = re.findall('\d{3}\s', txt)
print(result)
#输出:['123 ', '342 ']
4. 範囲
|: または、ab|bc など、ab または bc を表します。
[...]: 複数の選択、括弧内の任意の 1 つの要素
[az]: a~z 間の任意の単一要素と一致します。
[^...]: 否定、括弧内に単一の要素を含めることはできません
#某个资源可能以 http:// 开头,或者 https:// 开头,也可能以 ftp:// 开头
txt = 'http://www.baidu.com'
result = re.match('(https?|ftp):\/\/', txt)
print(result.span())
#输出:(0, 7)
2. 数量化子と貪欲さ
2.1 貪欲モード
通常のルールでは、程度を表す量指定子はデフォルトで貪欲ですが、貪欲モードでは、可能な最大長と一致しようとします。
#贪婪匹配
txt = 'aaabb'
result = re.findall(r'a*', txt)
print(result)
#输出:['aaa', '', '', '']
a* が先頭の a と一致する場合、最初の文字 b が要件を満たさなくなるまで、できるだけ多くの a と一致しようとします。3 つの a と一致し、一致するたびに空の文字列が取得されます。
貪欲モードの特徴は、可能な限り最大の長さに一致することです。
2.2 非貪欲モード
量指定子の後に英語の疑問符 (?) を追加すると、正規表現は a*? になり、これが非貪欲モードになります。
#非贪婪匹配
txt = 'aaabb'
result = re.findall(r'a*?', txt)
print(result)
#输出:['', 'a', '', 'a', '', 'a', '', '', '']
非貪欲モードは可能な限り短い時間で一致します
3. 機能
3.1findall()関数
findall()
この関数は、すべての一致を含むリストを返します。
#findall() 这个列表以被找到的顺序包含匹配项
txt = "China is a great country"
x = re.findall("China", txt)
print(x)
#输出:['China']
3.2 search() 関数
search()
この関数は文字列内で一致する文字列を検索し、一致する文字列が存在する場合は Match オブジェクトを返します。
複数の一致がある場合は、最初の一致のみが返され、一致が見つからない場合は値が返されます。 None
#search() 函数搜索字符串中的匹配项,如果存在匹配则返回 Match 对象
txt = "China is a great country"
x = re.search(r"\s", txt)
print("第一个空格位置", x.start())
#输出:第一个空格位置 5
3.3 split()関数
split()
この関数は、一致するたびに文字列が分割されたリストを返します。
#spilt 分割
txt = "China is a great country"
x = re.split(r"\s", txt)
print(x)
#输出:['China', 'is', 'a', 'great', 'country']
パラメータを指定して 出現数を制御しますmaxsplit
。
#通过指定 maxsplit 参数来控制出现次数:
txt = "China is a great country"
x = re.split(r"\s", txt, 2)
print(x)
['China', 'is', 'a great country']
3.4 sub() 関数
sub()
この関数は、一致したものを選択したテキストに置き換えます。
#sub() 函数把匹配替换为您选择的文本:
txt = "China is a great country"
x = re.sub("is", "IS", txt)
print(x)
#输出:China IS a great country
3.5 オブジェクトの一致
一致オブジェクトは、検索と結果に関する情報を含むオブジェクトです。
注: 一致するものがない場合は、 None
Match オブジェクトの代わりに値が返されます。
Match オブジェクトは、検索と結果に関する情報を取得するためのプロパティとメソッドを提供します。
span()
返されたタプルには、一致の開始位置と終了位置が含まれます.string
関数に渡された文字列を返しますgroup()
一致する文字列部分を返します
#正则表达式查找以大写 "C" 开头的任何单词
txt = "China is a great country"
x = re.search(r"\bC\w+", txt)
print(x.span())
#输出:(0, 5)
#打印匹配的字符串部分
print(x.group())
#输出:China
このドキュメントの詳細が十分でない場合は、「10 分で Python を学ぶ_bilibili_bilibili」を参照してください。