关于人工智能:Python正则表达式简介

51次阅读

共计 3470 个字符,预计需要花费 9 分钟才能阅读完成。

作者 |Irfan Alghani Khalid
编译 |VK
起源 |Towards Datas Science

假如你要依据给定的查问搜寻某个内容。如果你只依附一个字符串,你就得不到你想要的货色。那么,如何在海量信息中寻找你须要的货色呢?

当然,你须要一个模式来辨认你想要查找的字符串。为此,咱们能够应用正则表达式(Regular Expression,Regex)。

在本文中,我将向你展现它的概念和利用,以解决数据迷信中的问题,特地是应用 Python 对文本进行预处理。

纲要

我将本文分为两个局部:

  • 正则表达式的概念
  • 正则表达式的利用

正则表达式的概念

正则表达式,或者咱们称之为 Regex 或 RE,是一种非凡类型的字符串,可用于匹配字符串中的术语或单词。

它由特殊字符序列组成,因而咱们能够依据须要应用它来匹配任何术语。这里有几个你能够应用的特殊字符,

  • 点符号(.)匹配字符串中的任何字符,
  • 插入符号(^)与字符串的结尾匹配,
  • 美元符号($)与字符串的结尾匹配,
  • 星号(*)与前一个字符的模式反复零次或屡次匹配,
  • 加号(+)匹配前一个字符的一个或多个反复,
  • 问号(?)匹配上一个字符的 0 或 1 个反复,
  • 花括号 {m,n} 将匹配前一个字符的 m 或 n 个反复,
  • 如果要应用标点符号,能够应用反斜杠(),但它也是一个特殊字符。例如,为了匹配 $,你应该在“\$”这样的字符后面增加一个反斜杠,
  • 方括号([])只能用于蕴含与字符串匹配的某些字符。假如你想找到蕴含 a、i 和 r 的单词,能够应用相似 [air] 的模式。

回忆一下反斜杠有几个非凡的序列。如果你想蕴含所有的单词或数字而不把它们都写在方括号内,这是十分有用的。你能够应用这些序列,例如,

  • d 将匹配任何数字
  • s 将匹配空白字符
  • w 将匹配任何字符
  • D 匹配除数字外的字符
  • S 匹配除空分外的字符
  • W 匹配除字符外的字符

对于这些特殊字符,你能够依据要提取的术语组合它们。例如,你想要从 tweet 列表中检索 hashtags,能够应用相似“#w+”的模式。

模式的组合也是能够的,因为有一条规定说,

如果一个模式与一个模式联合,就会产生另一个模式。

正则表达式的利用

在你理解了 Regex 的概念之后,当初让咱们看看如何将其利用于解决文本。

第一种办法是删除咱们不用于解决文本的术语。假如你要对 tweet 汇合进行文本开掘。因而,在开掘 tweet 之前,必须先对它们进行预处理,因为咱们心愿使咱们的计算更无效,并防止其中任何无意义的信息。例如,你有这样一条微博,

#Nasional Wapres: Jumlah Orang Miskin Bertambah Gara-Gara Pandemi Covid-19 https://t.co/sJvig4w7LL

有几个术语你想删除,比方提及,标签,链接等。在 Python 中,咱们能够应用一个名为 sub 的办法从 re 库中删除这些术语。

咱们能够将参数设置到函数中,例如 regex 格局的模式、用于替换术语的字符串,最初是要解决的字符串。

re.sub(pattern, replacement, data) 
- pattern: 正则表达式的模式
- replacement: 要替换的字符串
- data: 要解决的变量或字符串

通过应用这个函数,咱们能够像这样应用它

import re

# 原始微博
tweet = "#Nasional Wapres: Jumlah Orang Miskin Bertambah Gara-Gara Pandemi Covid-19 https://t.co/sJvig4w7LL"

# 应用正则表达式进行预处理
tweet = re.sub("#\w+", "", tweet)
tweet = re.sub("https*.+", "", tweet)

print(tweet)
# 这是后果,
#  Wapres: Jumlah Orang Miskin Bertambah Gara-Gara Pandemi Covid-19

我想展现的另一个例子是搜寻和检索字符串外部的子字符串。在本例中,我将从一个被称为数据迷信的“hello world”的数据集中举一个例子。这是泰坦尼克号的数据集。

对于那些不晓得的人来说,这是一个数据集,被用来作为 Kaggle 比赛的介绍。这项比赛的指标是依据与乘客绝对应的数据来预测乘客是否幸存。数据集看起来像这样

它由几个列组成,形容乘客的人口统计、票价、姓名,以及形容乘客是否幸存的“Survived”列。在本例中,让咱们关注“Name”列。让咱们看几个例子,

0                               Braund, Mr. Owen Harris
1     Cumings, Mrs. John Bradley (Florence Briggs Th...
2                                Heikkinen, Miss. Laina
3          Futrelle, Mrs. Jacques Heath (Lily May Peel)
4                              Allen, Mr. William Henry
5                                      Moran, Mr. James
6                               McCarthy, Mr. Timothy J
7                        Palsson, Master. Gosta Leonard
8     Johnson, Mrs. Oscar W (Elisabeth Vilhelmina Berg)
9                   Nasser, Mrs. Nicholas (Adele Achem)
10                      Sandstrom, Miss. Marguerite Rut
11                             Bonnell, Miss. Elizabeth
12                       Saundercock, Mr. William Henry
13                          Andersson, Mr. Anders Johan
14                 Vestrom, Miss. Hulda Amanda Adolfina
15                     Hewlett, Mrs. (Mary D Kingcome) 
16                                 Rice, Master. Eugene
17                         Williams, Mr. Charles Eugene
18    Vander Planke, Mrs. Julius (Emelia Maria Vande...
19                              Masselmani, Mrs. Fatima
Name: Name, dtype: object

依据下面的样本,你看到它有什么模式吗?如果你具体理解,每个名字都有本人的题目,例如 Mr., Mrs., Miss., Master. 等等。咱们能够将这些名称提取为一个新的函数,称为“Title”。Title 包含了. 标点符号。因而,咱们能够应用模式提取它。

如何从每个名字中提取题目?咱们能够应用 re 库中的一个名为 search 的函数。应用该函数,咱们能够依据给定的模式提取术语。它须要模式和字符串列表。代码是这样的

def get_title(x):
  # 搜寻匹配的模式
  x = re.search('\w*\.', x).group()
  # 删除点标点符号以简化剖析过程
  x = re.sub('\.', '', x)
  return x

train['Title'] = train['Name'].apply(get_title)
train = train.drop('Name', axis=1)
train.head()

确保在搜寻字符串中的一个词之后,用一个名为 group 的办法链接函数。或者看起来像这样,

# 如果不应用 group 办法,它将显示
<_sre.SRE_Match object; span=(8, 11), match='Mr.'>

如果你做得对,后果会是这样的,

上面是搜寻函数及其办法的摘要

re.search(pattern, data)
parameters:
 - pattern: 适宜咱们想要的模式
 - data: 咱们应用的数据。它能够是字符串或字符串列表
methods:
 - group: 它返回一个或更多个字符串。

论断

以上是咱们如何应用正则表达式来解决应用 Python 的文本,这样咱们就能够通过删除无意义的信息来取得更有意义的论断解。我还向你展现了它的概念和一些利用。我心愿这篇文章对你有用。

还有一件事,回忆一下我下面的代码,我写的模式就像一个一般的字符串。然而为了确保你编写了一个 regex 模式,请在援用的模式之前增加 ’r’ 字符,如下所示

# 你能够这样写
re.sub("#\w+", "", tweet)

# 或者像这样
re.sub(r"#\w+", "", tweet)

就这样,谢谢你。

参考援用

[1]https://docs.python.org/3/lib…

[2]https://www.kaggle.com/c/titanic

原文链接:https://towardsdatascience.co…

欢送关注磐创 AI 博客站:
http://panchuang.net/

sklearn 机器学习中文官网文档:
http://sklearn123.com/

欢送关注磐创博客资源汇总站:
http://docs.panchuang.net/

正文完
 0