正\则表达式 (RegEx)**是一种特殊的字符序列,它使用搜索模式来查找字符串或字符串集。它可以通过将文本与特定模式进行匹配来检测文本是否存在,并且还可以将模式拆分为一个或多个子模式。Python 提供了一个\re**模块,支持在 Python 中使用正则表达式。它的主要功能是提供搜索,其中需要正则表达式和字符串。在这里,它要么返回第一个匹配项,要么不返回。在本文中,我们学习了有关 Python 正则表达式的所有内容,并看到了与其相关的各种示例。
\例子:**
此 Python 代码使用正则表达式在给定字符串中搜索单词\“portal”**,然后打印字符串中匹配单词的开始和结束索引。
import re s = 'GeeksforGeeks: A computer science portal for geeks' match = re.search(r'portal', s) print('Start Index:', match.start()) print('End Index:', match.end())
输出
Start Index: 34 End Index: 40
\注意:**这里的 r 字符(r'portal')代表原始,而不是正则表达式。原始字符串与常规字符串略有不同,它不会将 \ 字符解释为转义字符。这是因为正则表达式引擎使用 \ 字符来实现其自身的转义目的。
在开始使用 Python 正则表达式模块之前,让我们看看如何使用元字符或特殊序列实际编写正则表达式。
为了理解 RE 类比,元字符非常有用、重要,并且将在模块 re 的函数中使用。以下是元字符列表。
让我们详细讨论每个元字符
反斜杠 () 确保不会以特殊方式处理该字符。这可以被认为是转义元字符的一种方式。例如,如果您想在字符串中搜索点(.),那么您会发现点(.)将被视为特殊字符,就像元字符之一一样(如上表所示)。因此,对于这种情况,我们将在点(.)之前使用反斜杠(\),这样它就失去了它的特殊性。请参阅下面的示例以更好地理解。
第一个搜索\(** \)**匹配任何字符,而不仅仅是句点,而第二个搜索\(** \)**专门查找并匹配句点字符。`\re.search(r'.', s)********re.search(r'.', s)**`**
****
import re s = 'geeks.forgeeks' # without using \ match = re.search(r'.', s) print(match) # using \ match = re.search(r'\.', s) print(match)
<re.Match object; span=(0, 1), match='g'> <re.Match object; span=(5, 6), match='.'>
方括号 ([]) 表示由我们希望匹配的一组字符组成的字符类。例如,字符类 [abc] 将匹配任何单个 a、b 或 c。
我们还可以使用方括号内的 – 来指定字符范围。例如,
我们还可以使用插入符号 (^) 反转字符类。例如,
在此代码中,您使用正则表达式来查找字符串中“a”到“m”范围内的所有字符。该函数返回所有此类字符的列表。在给定的字符串中,与此模式匹配的字符为: 'c', 'k', 'b', 'f', 'j', 'e', 'h', 'l', 'd', ' G'。`\re.findall()**`**
import re string = "The quick brown fox jumps over the lazy dog" pattern = "[a-m]" result = re.findall(pattern, string) print(result)
['h'、'e'、'i'、'c'、'k'、'b'、'f'、'j'、'm'、'e'、'h'、'e'、' l'、'a'、'd'、'g']
脱字符号 (^) 与字符串的开头匹配,即检查字符串是否以给定字符开头。例如 -
此代码使用正则表达式来检查字符串列表是否以\“The”**开头。如果字符串以\“The”开头,则将其标记为“匹配”**,否则将标记为\“不匹配”。**
import re regex = r'^The' strings = ['The quick brown fox', 'The lazy dog', 'A quick brown fox'] for string in strings: if re.match(regex, string): print(f'Matched: {string}') else: print(f'Not matched: {string}')
Matched: The quick brown fox Matched: The lazy dog Not matched: A quick brown fox
Dollar($) 符号匹配字符串的结尾,即检查字符串是否以给定字符结尾。例如 -
此代码使用正则表达式来检查字符串是否以\“World!”结尾。**如果找到匹配项,它会打印\“找到匹配项!”** 否则,它会打印\“未找到匹配”**。
import re string = "Hello World!" pattern = r"World!$" match = re.search(pattern, string) if match: print("Match found!") else: print("Match not found.")
Match found!
点(.) 符号仅匹配除换行符 (\n) 之外的单个字符。例如 -
此代码使用正则表达式在字符串中搜索模式\“brown.fox” 。**模式中的点 ( ) 代表任意字符。.如果找到匹配项,它会打印\“找到匹配项!”** 否则,它会打印\“未找到匹配”**。
.
import re string = "The quick brown fox jumps over the lazy dog." pattern = r"brown.fox" match = re.search(pattern, string) if match: print("Match found!") else: print("Match not found.")
Or 符号用作 or 运算符,这意味着它检查 or 符号之前或之后的模式是否存在于字符串中。例如 -
问号 (?) 是正则表达式中的量词,表示前面的元素应该匹配零次或一次。它允许您指定该元素是可选的,这意味着它可能出现一次或根本不出现。例如,
星号 () 符号与 符号前面的正则表达式零次或多次匹配。例如 -
加号 (+) 匹配 + 符号前面出现的一个或多个正则表达式。例如 -
大括号匹配正则表达式之前从 m 到 n 的任何重复(包含这两个值)。例如 -
组符号用于对子模式进行分组。例如 -
特殊序列与字符串中的实际字符不匹配,而是告诉搜索字符串中必须出现匹配的特定位置。它使编写常用模式变得更加容易。
Python 有一个名为 re 的模块,用于 Python 中的正则表达式。我们可以使用import 语句导入该模块。
\示例:**在 Python 中导入 re 模块
import` `re
让我们看看该模块提供的各种用于在 Python 中使用正则表达式的函数。
以字符串列表的形式返回字符串中模式的所有非重叠匹配项。从左到右扫描字符串,并按找到的顺序返回匹配项。
\查找所有出现的模式**
此代码使用正则表达式\(** \)**查找给定字符串中一个或多个数字的所有序列。它搜索数值并将其存储在列表中。在此示例中,它从输入字符串中查找并打印数字\“123456789”**和\“987654321” 。****\**\d+\****
\**\d+\**
import re string = """Hello my Number is 123456789 and my friend's number is 987654321""" regex = '\d+' match = re.findall(regex, string) print(match)
['123456789', '987654321']
正则表达式被编译为模式对象,该对象具有用于各种操作的方法,例如搜索模式匹配或执行字符串替换。
\示例1:**
该代码使用正则表达式模式来查找并列出输入字符串\“Aye, said Mr. Gibenson Stark”**中从“a”到“e”的所有小写字母。输出将为,它们是匹配的字符。 `\[a-e]********['e', 'a', 'd', 'b', 'e']**`**
import re p = re.compile('[a-e]') print(p.findall("Aye, said Mr. Gibenson Stark"))
['e'、'a'、'd'、'b'、'e'、'a']
\输出:**
\了解输出:**
\示例 2:**集合类 [\s,.] 将匹配任何空白字符、',' 或 '.' 。
该代码使用正则表达式来查找并列出给定输入字符串中的所有单个数字和数字序列。它查找带有 的单个数字和带有 的数字序列。`\\d**** ****\d+**`**
** **
import re p = re.compile('\d') print(p.findall("I went to him at 11 A.M. on 4th July 1886")) p = re.compile('\d+') print(p.findall("I went to him at 11 A.M. on 4th July 1886"))
['1'、'1'、'4'、'1'、'8'、'8'、'6'] ['11', '4', '1886']
\示例3:**
该代码使用正则表达式来查找并列出输入字符串中的单词字符、单词字符序列以及非单词字符。它提供匹配字符或序列的列表。
import re p = re.compile('\w') print(p.findall("He said * in some_lang.")) p = re.compile('\w+') print(p.findall("I went to him at 11 A.M., he \ said *** in some_language.")) p = re.compile('\W') print(p.findall("he said *** in some_language."))
['H', 'e', 's', 'a', 'i', 'd', 'i', 'n', 's', 'o', 'm', 'e', '_', 'l', 'a', 'n', 'g'] ['I', 'went', 'to', 'him', 'at', '11', 'A', 'M', 'he', 'said', 'in', 'some_language'] [' ', ' ', '*', '*', '*', ' ', ' ', '.']
\示例4:**
该代码使用正则表达式模式“ab*”来查找并列出输入字符串“ababbaabbb”中所有出现的“ab”后跟零个或多个“b”字符的情况。它返回以下匹配列表:['ab', 'abb', 'abbb']。
import re p = re.compile('ab*') print(p.findall("ababbaabbb"))
['ab'、'abb'、'a'、'abbb']
按字符或模式的出现次数拆分字符串,找到该模式后,字符串中的剩余字符将作为结果列表的一部分返回。
\句法 :**
re.split(pattern, string, maxsplit=0, flags=0)
第一个参数,pattern表示正则表达式,string是给定的字符串,将在其中搜索pattern并在其中发生分割,maxsplit如果未提供则被视为零'0',如果提供任何非零值,则最多会发生那么多分裂。如果 maxsplit = 1,则字符串将仅拆分一次,从而产生长度为 2 的列表。标志非常有用,可以帮助缩短代码,它们不是必需的参数,例如:flags = re.IGNORECASE,在此拆分中,大小写,即小写或大写将被忽略。
使用非单词字符和空格作为分隔符分割字符串,返回单词:。将撇号视为非单词字符:. 使用非单词字符和数字进行拆分:. 使用数字作为分隔符进行分割:.`\['Words', 'words', 'Words']********['Word', 's', 'words', 'Words']**** ****['On', '12th', 'Jan', '2016', 'at', '11', '02', 'AM']********['On ', 'th Jan ', ', at ', ':', ' AM']**`**
from re import split print(split('\W+', 'Words, words , Words')) print(split('\W+', "Word's words Words")) print(split('\W+', 'On 12th Jan 2016, at 11:02 AM')) print(split('\d+', 'On 12th Jan 2016, at 11:02 AM'))
['Words', 'words', 'Words'] ['Word', 's', 'words', 'Words'] ['On', '12th', 'Jan', '2016', 'at', '11', '02', 'AM'] ['On ', 'th Jan ', ', at ', ':', ' AM']
\示例2:**
第一条语句在第一次出现一个或多个数字时分割字符串:。第二个使用小写字母 a 到 f 作为分隔符分割字符串,不区分大小写:。第三步使用小写字母 a 到 f 作为分隔符分割字符串,区分大小写:。`\['On ', 'th Jan 2016, at 11:02 AM']**** ****['', 'y, ', 'oy oh ', 'oy, ', 'ome here'****]****['', 'ey, Boy oh ', 'oy, ', 'ome here']**`**
**
import re print(re.split('\d+', 'On 12th Jan 2016, at 11:02 AM', 1)) print(re.split('[a-f]+', 'Aey, Boy oh boy, come here', flags=re.IGNORECASE)) print(re.split('[a-f]+', 'Aey, Boy oh boy, come here'))
['On ', 'th Jan 2016, at 11:02 AM'] ['', 'y, ', 'oy oh ', 'oy, ', 'om', ' h', 'r', ''] ['A', 'y, Boy oh ', 'oy, ', 'om', ' h', 'r', '']
函数中的'sub'代表SubString,在给定的字符串(第三个参数)中搜索某个正则表达式模式,找到子字符串模式后用repl(第二个参数)替换,count检查并维护次数出现这种情况。
\句法:**
re.sub(pattern, repl, string, count=0, flags=0)
第一条语句将所有出现的 'ub' 替换为 '~' (不区分大小写):。第二条语句将所有出现的 'ub' 替换为 '~' (区分大小写):。第三条语句将第一次出现的 'ub' 替换为 '~' (不区分大小写):。第四个将“AND”替换为“&”(不区分大小写):***。**\**'S~\*ject has ~\*er booked already'\****`\'S~*ject has Uber booked already'*******'S~\ject has Uber booked already'********'Baked Beans & Spam'**`**
\**'S~\*ject has ~\*er booked already'\**
import re print(re.sub('ub', '~*', 'Subject has Uber booked already', flags=re.IGNORECASE)) print(re.sub('ub', '~*', 'Subject has Uber booked already')) print(re.sub('ub', '~*', 'Subject has Uber booked already', count=1, flags=re.IGNORECASE)) print(re.sub(r'\sAND\s', ' & ', 'Baked Beans And Spam', flags=re.IGNORECASE))
S~*ject has ~*er booked already S~*ject has Uber booked already S~*ject has Uber booked already Baked Beans & Spam
\输出**
subn() 在所有方面都与 sub() 类似,除了提供输出的方式之外。它返回一个元组,其中包含替换总数和新字符串的计数,而不仅仅是字符串。
re.subn(pattern, repl, string, count=0, flags=0)
`\re.subn()**`**替换字符串中出现的所有模式,并返回一个包含修改后的字符串和替换计数的元组。它对于区分大小写和不区分大小写的替换都很有用。
import re print(re.subn('ub', '~*', 'Subject has Uber booked already')) t = re.subn('ub', '~*', 'Subject has Uber booked already', flags=re.IGNORECASE) print(t) print(len(t)) print(t[0])
('S~*ject has Uber booked already', 1) ('S~*ject has ~*er booked already', 2) Length of Tuple is: 2 S~*ject has ~*er booked already
返回所有非字母数字反斜杠的字符串,如果您想匹配其中可能包含正则表达式元字符的任意文字字符串,这非常有用。
re.escape(string)
`\re.escape()**`**用于转义字符串中的特殊字符,使其可以安全地用作正则表达式中的模式。它确保正则表达式中具有特殊含义的任何字符都被视为文字字符。
import re print(re.escape("This is Awesome even 1 AM")) print(re.escape("I Asked what is this [a-9], he said \t ^WoW"))
This\ is\ Awesome\ even\ 1\ AM I\ Asked\ what\ is\ this\ \[a\-9\]\,\ he\ said\ \ \ \^WoW
此方法要么返回 None (如果模式不匹配),要么 re.MatchObject 包含有关字符串的匹配部分的信息。此方法在第一次匹配后停止,因此这最适合测试正则表达式而不是提取数据。
\示例:**搜索模式的出现
此代码使用正则表达式来搜索给定字符串中的模式。如果找到匹配项,它将提取并打印字符串的匹配部分。在此特定示例中,它在输入字符串“I wasbirth on June 24”中搜索由月份(字母)后跟日期(数字)组成的模式。如果找到匹配项,它将打印完整的匹配项、月份和日期。
import re regex = r"([a-zA-Z]+) (\d+)" match = re.search(regex, "I was born on June 24") if match != None: print ("Match at index %s, %s" % (match.start(), match.end())) print ("Full match: %s" % (match.group(0))) print ("Month: %s" % (match.group(1))) print ("Day: %s" % (match.group(2))) else: print ("The regex pattern does not match.")
Match at index 14, 21 Full match: June 24 Month: June Day: 24
Match 对象包含有关搜索和结果的所有信息,如果未找到匹配项,则将返回 None。我们来看看match对象的一些常用方法和属性。
\match.re**属性返回传递的正则表达式,\match.string**属性返回传递的字符串。
\示例:**获取匹配对象的字符串和正则表达式
该代码在字符串\“Welcome to GeeksForGeeks”**中的单词边界处搜索字母\“G”**,并打印正则表达式模式\(** \)**和原始字符串\(** \)**。`\res.re********res.string**`**
import re s = "Welcome to GeeksForGeeks" res = re.search(r"\bG", s) print(res.re) print(res.string)
re.compile('\\bG') Welcome to GeeksForGeeks
\示例:**获取匹配对象的索引
该代码在字符串“Welcome to GeeksForGeeks”中的单词边界处搜索子字符串“Gee”,并打印匹配的开始索引 ( )、匹配的res.start()结束索引 ( res.end()) 和匹配的跨度 ( res.span())。
res.start()
res.end()
res.span()
import re s = "Welcome to GeeksForGeeks" res = re.search(r"\bGee", s) print(res.start()) print(res.end()) print(res.span())
11 14 (11, 14)
group() 方法返回模式匹配的字符串部分。请参阅下面的示例以更好地理解。
\示例:**获取匹配的子字符串
该代码在字符串“Welcome to GeeksForGeeks”中搜索由两个非数字字符组成的序列,后跟空格和字母“t”,并使用 打印匹配的文本。`\res.group()**`**
import re s = "Welcome to GeeksForGeeks" res = re.search(r"\D{2} t", s) print(res.group())
me t
在上面的示例中,我们的模式指定包含至少 2 个字符且后跟一个空格的字符串,并且该空格后跟一个 t。
原文链接:codingdict.net