在处理大量文本数据时,提取关键信息是一项基本且重要的任务。这涉及到从非结构化数据中识别并提取结构化信息,例如公司名称、财务报告中的价格、法官姓名、法庭判决中的管辖区、客户投诉中的账号等。这些提取工作是文本挖掘的一部分,它们将非结构化数据转换为结构化形式,以便后续进行分析和机器学习应用。
实体提取通常采用的方法包括“查找”、“规则”和“统计/机器学习”。在基于“查找”的方法中,输入文档中的词汇会与预定义的数据字典进行比对。基于“规则”的方法则是通过模式搜索来寻找关键信息。而在基于“统计”的方法中,则使用有监督和无监督的方法来提取信息。
正则表达式(RegEx)是“规则”基础的模式搜索方法之一。它是一种强大的文本处理工具,用于搜索、替换符合某个模式(规则)的文本。Python通过名为“re”的库支持正则表达式,尽管它并不完全兼容Perl。在Python中,使用原始字符串“r”来指定搜索模式,这样反斜杠和元字符就不会被Python解释,而是直接发送给RegEx。
以下是正则表达式的基本语法:
abc… # 字母
{m} # m次重复
123… # 数字
{m,n} # m到n次重复
\d # 任意数字
* # 零次或多次重复
\D # 任意非数字字符
+ # 一次或多次重复
. # 任意字符
? # 可选字符
\. # 点号
\s # 任意空白字符
[abc] # 仅a、b或c
\S # 任意非空白字符
[^abc] # 非a、b或c
^…$ # 开始和结束
[a-z] # 字符a到z
(…) # 捕获组
[0-9] # 数字0到9
(a(bc)) # 捕获子组
\w # 任意字母数字字符
(.*) # 捕获全部
\W # 任意非字母数字字符
(abc|def) # 匹配abc或def
import re
# 编译正则表达式模式
regex = re.compile(r"(\w+) Lamb")
# 待匹配的文本
text = "Mary had a little Lamb"
# 搜索结果
result = regex.search(text)
正则表达式在实际应用中的一些常见场景包括:
例如,要编写代码搜索文档中的电话号码,可能会有多种格式变化。使用正则表达式,代码可以非常简洁且高度可定制。以下是一些正则表达式的使用示例:
# 电子邮件地址
"^[a-zA-Z0-9_\-]+@[a-zA-Z0-9_\-]+\.[a-zA-Z0-9_\-]"
# 电话号码
"([0-9]{3}-){2}[0-9]{4}[^0-9]*$" # xxx-xxx-xxxx
"[0-9]{10}[^0-9]*$" # xxxxxxxxxxx
对于更复杂的电话号码模式,可以使用以下代码:
import re
phoneRegex = re.compile(r'''
(
(\d{3}|\(\d{3}\))? # 区号
(\s|-|\.)? # 分隔符
(\d{3}) # 前3位数字
(\s|-|\.) # 分隔符
(\d{4}) # 后4位数字
(\s*(ext|x|ext.)\s*(\d{2,5}))? # 扩展名
)''', re.VERBOSE)
正则表达式虽然强大,但在处理复杂任务时可能会变得复杂。理解(和调试)别人的正则表达式可能更具挑战性!有许多友好的工具可以帮助开发、测试和调试正则表达式。例如,提供了一个平台,让可以输入自己的文本并尝试正则表达式模式。
像这样的网站为正则表达式搜索模式提供了可视化表示,以便更好地理解。一旦正则表达式提供了可接受的匹配,该模式就可以在程序中使用。经过足够的练习,可以直接在程序中编写搜索模式。