正規表現はNLPの基本的なアプリケーションです。正規表現は、検索パターンを定義する特徴的なシーケンスであり、主に文字列のパターンマッチングや文字マッチングに使用されます。reモジュールは、正規表現を操作するためのモジュールです。
1つ、re.matchマッチング
1.re.matchの使用法
re.matchは、文字列の先頭からパターンを照合しようとします。最初に照合が成功しなかった場合、match()はnoneを返します。
a)関数構文
re.match(pattern, string, flags=0)
# re.match(<正则表达式>,<需要匹配的字符串>)
b)機能パラメータの説明
パラメータ | 説明 |
---|---|
パターン | 一致する正規表現 |
ストリング | 一致する文字列。 |
フラグ | フラグビットは、大文字と小文字を区別するか、複数行のマッチングなど、正規表現のマッチングモードを制御するために使用されます。参照:正規表現修飾子-オプションのフラグ |
c)一致するオブジェクトを返す
一致が成功した場合、re.matchメソッドは一致したオブジェクトを返します。それ以外の場合は、Noneを返します。
group(num)またはgroups()マッチングオブジェクト関数を使用して、マッチング式を取得できます。
マッチオブジェクトメソッド | 説明 |
---|---|
group(num = 0) | 式の文字列全体を照合するために、group()は一度に複数のグループ番号を入力できます。その場合、それらのグループに対応する値を含むタプルが返されます。 |
groups() | 1から含まれるグループ番号までのすべてのグループ文字列を含むタプルを返します。 |
2.re.matchの例
a)例1
import re
print(re.match('www', 'www.runoob.com')) # 在起始位置匹配
print(re.match('www', 'www.runoob.com').group()) # 返回匹配到的内容
print(re.match('www', 'www.runoob.com').span()) # 返回匹配到的内容在文本的索引
print(re.match('com', 'www.runoob.com'))
# ---output-----
<_sre.SRE_Match object; span=(0, 3), match='www'>
www
(0, 3)
None
注意:
- 返された一致オブジェクトは、span()メソッドを使用して一致インデックスを返します。
- 一致するものがない場合は、Noneを返します。
b)例2
import re
line = "Cats are smarter than dogs"
matchObj = re.match( r'(.*) are (.*?) .*', line, re.M|re.I)
if matchObj:
print ("matchObj.group() : ", matchObj.group())
print ("matchObj.group(1) : ", matchObj.group(1))
print ("matchObj.group(2) : ", matchObj.group(2))
print ("matchObj.groups() : ", matchObj.groups())
else:
print ("No match!!")
# ---output------------
matchObj.group() : Cats are smarter than dogs
matchObj.group(1) : Cats
matchObj.group(2) : smarter
matchObj.groups() : ('Cats', 'smarter')
第二に、正規表現パターン
1、1文字に一致
一致記号 | 一致する意味 |
---|---|
。 | 任意の1文字に一致します(\ nを除き、re.Sを使用して\ nを含めることができます) |
[] | []にリストされている文字と一致します |
\ d | 一致番号、つまり0〜9 |
\ D | 数字以外に一致する |
\ s | 空白、つまりスペース、タブキーを一致させる |
\ S | 空白以外に一致 |
\ w | 空白以外、つまりaz、AZ、0-9、_、漢字に一致する |
\ W | 特殊文字、つまり文字、数字、漢字以外の文字に一致します |
注意:
- '。'は\ n以外の文字にのみ一致します。\ nに一致させたい場合は、正規表現の後にre.Sを追加できます。
- \ wは複数の言語にも一致する可能性があるため、注意して使用してください。
- \ sは\ nに一致させることができます
- []一致する10個の数字が利用可能[0-9]、26文字が利用可能[az]
- []の一致は、指定された文字を除いて一致します:[^ abcde]
2.複数の文字を一致させる
一致記号 | 一致する意味 |
---|---|
* | 前の文字を0回または無制限に一致させると、不要になる可能性があります |
+ | 前のキャラクターと1回または無制限に一致する、つまり少なくとも1回 |
? | 前の文字に1回または0回一致します。つまり、1回またはいいえのいずれかです。 |
{m} | 前の文字とm回一致する |
{m、n} | 前の文字をm回からn回一致させる |
注:
これは、正規表現の貪欲な性質を反映している可能性があります。同じ条件下で、*、+、?が自動的に使用されます。、{1,5}は多くの文字に一致します。貪欲な機能をキャンセルするには、*?、+?、??、{}?を使用できます。
3.指定された文字を除いて、最初と最後を一致させます
a)最初と最後を一致させる
式に^がある場合、一致したコンテンツの最初の文字は正規表現の最初の文字と一致する必要があります。そうでない場合、出力はありません。
式に$がある場合は、一致したコンテンツの最後の文字が正規表現の最後の文字と一致する必要があることを意味します。一致しない場合、出力はありません。
一致記号 | 一致する意味 |
---|---|
^ | 文字列の先頭に一致する |
$ | 文字列の終わりに一致 |
b)指定された文字を除くすべての一致
[^指定字符]: 表示除了指定字符都匹配
# [^>]*> 表示 只要不是 字符> 就可以匹配多个,直到遇到>
# | 在此处表示 并
re.sub(r'<[^>]*>|\s| ','',strs) # 表示将strs中在匹配到的字符替换成无,并输出替换后的strs
4.マッチンググループ
- 文字「|」はまたはここを意味し、またはの範囲は角かっこ()で制限されます。
- ()内の文字はグループとして使用され、group(num)内のnumはどのグループを取り出すかを指定します
- \ numは、正規表現のグループnumと一致する文字を指します
- (?P)エイリアスからのグループ化(?P = name)名前グループと一致する文字列としてエイリアスを引用
一致記号 | 一致する意味 |
---|---|
| | 左右の式のいずれかに一致します |
(から) | 括弧内の文字をグループとして使用します |
\ on one | グループ番号と一致する文字列を引用する |
(?P) | そのエイリアスをグループ化する |
(?P =名前) | 名前グループと一致する文字列をエイリアスで引用します |
3、re.searchマッチング
一致との違いは次のとおりです。最初から一致しない、テキスト内の一致するアイテムを検索する、1回だけ検索する
import re
# 根据正则表达式查找数据,注意:只查找一次
match_obj = re.search("\d+","水果有20个,其中苹果10个.")
if match_obj:
# 获取匹配结果数据
print(match_obj.group())
else:
print("匹配失败")
#---output-----
20
4、re.findallマッチング
基本的に検索と同じですが、複数回検索できます
import re
# 根据正则表达式查找数据,注意:只查找一次
result = re.findall("\d+","水果有20个,其中苹果10个.")
print(result)
# ---output------
['20', '10']
5、re.subは一致したデータを置き換えます
1.文字列を使用して置き換えます
import re
# count=0 替换次数,默认全部替换,count=1根据指定次数替换
result = re.sub("\d+","2","评论数:10,点赞数:20",count=1)
print(result)
# ---output------
评论数:2,点赞数:20
2.関数を使用して置き換えます
import re
# match_obj:该参数系统自动传入
def add(match_obj):
# 获取匹配结果的数据
value = match_obj.group()
result = int(value) + 1
# 返回值必须是字符串类型
return str(result)
result = re.sub("\d+",add,"阅读数:10")
print(result)
# ---output-----
阅读数:11
6、re.split(|は和集合を意味します)
一致に応じて文字列を切り取り、リストを返します
import re
ret = re.split(r":| ",'info:xiaozhang 33 shangdong')
print(ret)
# ---output----
['info', 'xiaozhang', '33', 'shangdong']
セブン、貪欲と非貪欲
「*」、「?」、「+」、「{m、n}」の後に追加しますか?、貪欲を非貪欲にする。
import re
s = "This is a number 234-235-22-423"
r = re.match(".+(\d+-\d+-\d+-\d+)",s)
print(r.group(1))
#---output------
4-235-22-423
正则表达式模式中使用到通配字,那它在从左到右的顺序求值时,会尽量“抓取”满足匹配最长字符串,在我们上面的例子里面,“.+”会从字符串的启始处抓取满足模式的最长字符,其中包括我们想得到的第一个整型字段的中的大部分,“\d+”只需一位字符就可以匹配,所以它匹配了数字“4”,而“.+”则匹配了从字符串起始到这个第一位数字4之前的所有字符。
import re
s = "This is a number 234-235-22-423"
r = re.match(".+?(\d+-\d+-\d+-\d+)",s)
print(r.group(1))
#---output------
234-235-22-423
解决方式:非贪婪操作符“?”,这个操作符可以用在"*","+","?"的后面,这样“?”前面的正则表达式不能匹配“?”后面正则表达式的数据
八,r的作用
- Python中字符串前面加上 r 表示原生字符串,数据里面的反斜杠不需要进行转义,针对的只是反斜杠。
- Python里的原生字符串很好地解决了这个问题,有了原生字符串,你再也不用担心是不是漏写了反斜杠,写出来的表达式也更直观。
- 建议: 如果使用使用正则表达式匹配数据可以都加上r,要注意r针对的只是反斜杠起作用,不需要对其进行转义
match_obj = re.search('e\\\\/','''i have one nee\/dle''')
match_obj.group()
#---output----
'e\\/'
import re
match_obj = re.match(r"<([a-zA-Z1-9]+)>.*</\1>", "<html>hh</html>")
if match_obj:
print(match_obj.group())
print(match_obj.group(1))
print(match_obj.groups())
else:
print("匹配失败")
# ---output------
<html>hh</html>
html
('html',)