首页 > 数据分析 > 使用正则表达式从报表中提取信息

[悬赏]使用正则表达式从报表中提取信息 (已翻译100%)

查看 (502次)
英文原文:Extracting information from reports using Regular Expressions Library in Python
标签: 正则表达式
admin 发布于 2017-04-06 11:18:04 (共 8 段, 本文赏金: 27元)
参与翻译(3人): ABOER cyt5969858 廿九_ 默认 | 原文

【已悬赏】 赏金: 3元

Introduction

很多时候我们需要从报道、文章、报纸等内容中获取关键词。例如从金融类报道中获取公司的股价、从法院判决书中获取法官的名称、从客户的反馈中获取用户的帐号等等。将这些信息抽取出来是文本挖掘的一部分,也是将非结构化数据转换成结构化数据从而进行统计分析或机器学习必须的过程。将这些实体抽取出来的方法有“查找法”、“规则法”、“统计方法或机器学习方法”。在“查找法”中,如果单词出现在预定的数据字典里就被提取出来。在“规则法”中,通过模式搜索来发现关键信息。而在“统计方法”中,监督学习和非监督学习被用来提取信息。“正则表达式”就是“规则法”中常用的一种搜索模式。

ABOER
翻译于 2017-06-06 15:53:49
 

参与本段翻译用户:
ABOER

显示原文内容

【已悬赏】 赏金: 3元

基本语法

Python支持名为“re”的库的正则表达式(尽管它不是完全兼容Perl语言)。搜索模式专门使用原生字符串“r”,而不是常规的字符串,因此,反斜杠和元字符不被Python解译,而是直接传递给正则表达式。

通过以下的本语法表了解正则表达式

abc… 字母 {m} m 重复
123… 数字 {m,n} m至n重复
\d 任一数字 * 0或多次重复
\D 任一非数字 1或多次重复
. 任一字符 ? 可选字符
\. 句号 \s 匹配空格
[abc] 仅为 a, b, 或 c \S 匹配非空格
[^abc] 不为 a, b, 和 c ^…$ 起止
[a-z] 字母 a to z (…) 捕获组
[0-9] 数字 0 to 9 (a(bc)) 捕获子组
\w 任一字母或数字字符 (.*) 捕获所有
\W 任一非字母和数字字符 (abc|def) 匹配 abc 或者 def


通过以下Python示例代码
使用正则表达式。

cyt5969858
翻译于 2017-11-30 15:13:01
 

参与本段翻译用户:
cyt5969858

显示原文内容

【已悬赏】 赏金: 3元
import re
regex = r"([a-zA-Z] ) (\d )" 
text = "June 24" match = 
re.search(regex, text) if 
match:
    #   match.group() or match.group(0) always returns the fully matched string i.e. "June 24"     
print "Match: %s" % (match.group(0))
    #   match.group(1) match.group(2), ... will return the capture groups in order
print "Month: %s" % (match.group(1)) # "June"     print "Day: %s" % 
(match.group(2)) # "24" else:
    # If re.search() does not match, then None is returned     
print "The regex pattern does not match. :("

与“re.search”返回所有精确匹配不同的是,“re.findall()”方法可以用来返回所有的捕获组。“re.sub”用于将另一个模式替代给定搜索模式。出于性能原因,建议先使用“re.compile” 的编译模式,然后使用正则表达式对象进行搜索,如下所示。

regex = re.compile(r"(\w ) Lamb") 
text = "Mary had a little Lamb" 
result = regex.search(text)

更多关于在Python中使用正则表达式的信息可以在Regex One和在这篇文章中找到。

cyt5969858
翻译于 2017-11-30 15:21:56
 

参与本段翻译用户:
cyt5969858

显示原文内容

【已悬赏】 赏金: 8元

使用案例

想象编写在文档中寻找电话号码 91-9890251406的代码,这些电话号码有不同格式的变化。在有效的情况下,代码通常会超过10行(此处的样本)。但使用正则表达式,代码量约为之前的2 / 3行,并具有很高的可定制性。



以下是一些常见的情况,在这些情景下正则表达式可以提供实质性帮助。请注意,所示的案例可以用其他的方法得到相同的结果,特别是利用元字符如“/d”代替“[0-9]”来表示数字。在大多数的例子中,表达性和简单的代码模式用在这里只是为了清晰易懂。

查找邮件

“^[a-zA-Z0-9_\-] @[a-zA-Z0-9_\-] \.[a-zA-Z0-9_\-]” x@y.z
“@\w .\w ” 邮件域名


查找电话号码

“([0-9]{3}-){2}[0-9]{4}[^0-9]*$” xxx-xxx-xxxx
“([0-9]{3}.){2}[0-9]{4}[^0-9]*$” xxx.xxx.xxxx
“[0-9]{10}[^0-9]*$” xxxxxxxxxx
“\\([0-9]{3}\\)[0-9]{3}-[0-9]{4}[^0-9]*$”  (xxx)xxx-xxxx


前两个案例的区别只是在“-”和“.”因此也可以结合使用“(-|\.)”表示。
更详细的查找电话号码的示例代码如下所示:

phoneRegex = re.compile(r'''(
    (\d{3}|\(\d{3}\))?                       # area code
    (\s|-|\.)?                                     # separator
    (\d{3})                                           # first 3 digits
    (\s|-|\.)                                        # separator
    (\d{4})                                           # last 4 digits
    (\s*(ext|x|ext.)\s*(\d{2,5}))?  # extension
    )''', re.VERBOSE)
cyt5969858
翻译于 2017-11-30 15:36:26
 

参与本段翻译用户:
cyt5969858

显示原文内容

【已悬赏】 赏金: 1元

查找日期

“\d{2}-\d{2}-\d{4}” xx-xx-xxxx 不检查数字
“([2-9]|1[0-2]?)-[0-3][1-9]-[1-2][9|0][0-9]{2}[^0-9]*$” xx-xx-xxxx 更严谨的用法
“([2-9]|1[0-2]?)/[0-3][1-9]/[1-2][9|0][0-9]{2}” xx/xx/xxxx
“[1-2][9|0][0-9]{2}/([2-9]|1[0-2]?)/[0-3][1-9]” xxxx/xx/xx


上面使用的日期模式仅为数字方式。还有其他如’27-Mar-1973′ or ’27 March 1973′的用法。我会把这个作为一个公开题并希望参与者思考他们自己的正则表达式方式!!

cyt5969858
翻译于 2017-11-30 15:39:29
 

参与本段翻译用户:
cyt5969858

显示原文内容

【已悬赏】 赏金: 3元

查找帐户/信用卡号码

“([0-9]{4}-){3}[0-9]{4}” xxxx-xxxx-xxxx-xxxx
“[0-9]{16}” xxxxxxxxxxxxxxxx


添加链接信息

搜索论文或判断中的引用有预先定义的格式,它们指的是外部文档。可以通过替换引文来追加超链接信息。

例如,美国法律判决的引用看起来就像“美国法典”第17章第107节。模式是:文本“U.S.C.”,空格,§标记,空格,一组数字,或者,在括号一年。它可以替换为“<ahref…/a>”超链接到它所指的实际判断。

开发、测试和调试工具

虽然RegEx很强大,但对于非平凡的任务来说,它会变得复杂。更具有挑战性的是,你必须通过别人理解(和调试)RegEx

有相当多的友好实用程序帮助开发和测试RegEx。试试Regex 101。它放置自己的文本,并尝试RegEx模式提供了方便。

廿九_
翻译于 2018-01-25 09:59:57
 

参与本段翻译用户:
廿九_

显示原文内容

【已悬赏】 赏金: 4元

这里有一个样本文本包含之前提到的电话号码、帐户号码、日期模式以供尝试。

919890251406 01110100 555.867.5309 01101000


9890251406 1.4142135623 01101001 27/3/1973 987-01-6661

01110011 202.555.9355 00100000 01101001 91-020-25898963

912025898963 3.1415926535897932384626433832795 666-

12-4895 01100001 202-555-9355 27-03-1973 00100000

01101000 (555) 867-5309 27-Mar-1973 2.718281828459 555-

867-5309 01100101 01110011 01110011 555/867-5309


RegExper
等网站给出了正则表达式搜索模式的可视化方式有助于更好理解正则表达式。可以参阅下面的用于解释之前提到的PhoneRegex搜索模式的可视化图表,用于匹配电话号码。

一旦正则表达式给出可接受的匹配模式,该模式就可以在程序中使用。经过足够好的练习之后,就能直接在程序本身中进行搜索模式的编码。


在此使用的所有的正则表达式模式,经过一些小的修改,就可以在Python、Perl、java等编程语言中使用。还可用于一些流行的文本编辑器中的查找-替换功能,如Microsoft Word(保持“使用通配符”功能开启),OpenOffice和PyCharm之类的集成开发环境。可以在此阅读关于正则表达式的所有信息。

cyt5969858
翻译于 2017-11-30 15:56:49
 

参与本段翻译用户:
cyt5969858

显示原文内容

【已悬赏】 赏金: 2元

文末说明

RegEx是一种从文本数据中提取关键信息的通用、可移植和强大的方法。掌握它可以帮助实现许多日常任务的自动化。虽然有时会变得很复杂和难以开发调试,但由于其巨大的能力,它已成为每一个程序员的盔甲,特别是文本分析数据科学家必须的武器。

最后,让我给大家一个思考:RegEx可以用来解决一个纵横字谜吗?

把你的答案写在下面。如果你有问题,可以在评论部分随意发布。


廿九_
翻译于 2018-01-25 10:02:29
 

参与本段翻译用户:
廿九_

显示原文内容

GMT+8, 2018-11-17 04:19 , Processed in 0.047271 second(s), 11 queries .