Skip to content

正则抽取与解析 说明文档

冬日新雨 edited this page Mar 24, 2021 · 34 revisions

抽取 E-mail

extract_email

抽取文本中的 E-mail 信息,并返回其在文本中的位置offset,以及所属域名domain_name

>>> import jionlp as jio
>>> text = '请发简历至[email protected]。' 
>>> emails = jio.extract_email(text, detail=True))

#  [{'text': '[email protected]', 
#    'offset': [6, 18], 
#    'domain_name': '163'}, 
  • 暂不支持带中文字符的邮箱名称。

抽取金额字符串

extract_money

money_standardization

抽取文本中的金额字符串,并提供将其转换为标准数字格式的函数。

>>> import jionlp as jio
>>> text = '张三赔偿李四人民币车费601,293.11元,工厂费一万二千三百四十五元,利息9佰日元,打印费十块钱。' 
>>> moneys = jio.extract_money(text)
>>> standard_moneys = [jio.money_standardization(i) for i in moneys]

#  moneys: ['601,293.11元', '一万二千三百四十五元', '9佰日元', '十块钱']
#  standard_moneys: ['601293.11元', '12345.00元', '900.00日元', '10.00元']
  • 支持标准数字格式,如:1,034,192.07元
  • 支持纯数字格式,如:987273.3美元
  • 支持大写中文金额,如:柒仟六佰零弎萬肆仟叁佰贰拾壹元伍分
  • 支持混合格式,如:1.26万港元
  • 支持口语化中文格式,如:三十五块三毛;但对于“三十五块八”这样的字符串,在文本中存在歧义,如“三十五块八颗糖”等,因此,extract_money 对于此字符串不予抽取,但money_standardization可以将“三十五块八”看作完整的口语化金额,标准化为“35.80元”
  • 支持多种常见货币类型:人民币,港元,澳门元,美元,日元,澳元,韩元,卢布,英镑,马克,法郎,欧元,加元等。

抽取电话号码

extract_phone_number

抽取文本中的电话号码信息,并返回其在文本中的位置offset,以及电话号码类别type,包括手机(cell_phone)和座机(landline_phone)。

>>> import jionlp as jio
>>> text = '有疑问请联系张小姐18340234920,或拨打(028)58291283。。' 
>>> phones = jio.extract_phone_number(text, detail=True))

# [{'text': '18340234920', 
#    'offset': [9, 18], 
#    'type': 'cell_phone'}, 
#   {'text': '(028)58291283', 
#    'offset': [24, 35], 
#    'type': 'landline_phone'}]
  • 支持解析手机号码归属地 和 座机区号归属地解析,须配合 jio.phone_location 使用

抽取 QQ

extract_qq

抽取文本中的 QQ 号,由于qq号特征不突出,故分为严格和非严格两种,默认 strict 为 True。

# 例 1
>>> import jionlp as jio
>>> text = '你加一下我的QQ: 123410942' 
>>> res = jio.extract_qq(text, detail=True))
>>> print(res)

# [{'text': '123410942', 'offset': [11, 18]}]

# 例 2

>>> text = '收纳金额为123410942元,进而导致...'
>>> res = jionlp.extract_qq(text, detail=True)
>>> print(res)

# []
  • QQ 号特征不突出指的是 11位的 QQ 号会和 11位的电话号码,甚至其它数据格式等混淆
  • 宽松规则指符合 QQ 号特征的号码全部抽取,可能造成一定的混淆
  • 严格规则指在满足 QQ 号本身特征基础上,文本须包含 qq、QQ、加Q 等字样

抽取身份证号

extract_id_card

抽取文本中的身份证号,与 jionlp.parse_id_card 函数配合使用解析身份证号中的地址、出生年月、性别、校验码等信息

>>> text = '此人身份证号是 21040319560330098x,曾经...'
>>> res = jionlp.extract_id_card(text, detail=True)
>>> print(res)

# [{'text': '21040319560330098x', 'offset': [9, 25]}]

>>> res = jionlp.parse_id_card(res[0]['text'])


抽取 URL 超链接

extract_url

抽取文本中的超链接,包括 http、https、ftp 等类型。

>>> text = '让我这个手机知乎党来终结这个问题吧!http://link.ipaiban.com/#手机文字链接生成器!'
>>> res = jionlp.extract_id_card(text, detail=False)
>>> print(res)

# ['http://link.ipaiban.com/']

抽取 IP 地址

extract_ip_address

抽取文本中的 ip 地址,仅限于 ipv4。

>>> text = '链接ip地址你知道吗?是0.0.0.0!'
>>> res = jionlp.extract_ip_address(text, detail=False)
>>> print(res)

# ['0.0.0.0']
  • 支持判断 ip 地址值介于 0~255 之间,超过则不会返回结果

抽取文本括号信息

extract_parentheses

抽取文本中的括号中的内容,括号类型主要包括 {}「」[]【】()()<>《》

>>> text = '【重磅新闻】特朗普选举失利'
>>> res = jionlp.extract_parentheses(text)
>>> print(res)

# ['【重磅新闻】']
  • 若括号仅只有半个,则不做处理,如“【重磅新闻,特朗普选举失利”
  • parentheses参数默认为{}「」[]【】()()<>《》,可根据需要进行指定,如仅抽取书报名时,可指定为《》

删除文本中的 E-mail

remove_email

删除文本中的 E-mail 信息,一般用于将其当做无关噪声,处理分析数据。

>>> text = '张晨星[email protected],现在电子邮件可以带中文了吗?'
>>> res = jionlp.remove_email(text)
>>> print(res)

# '张晨星,现在电子邮件可以带中文了吗?'
  • 从该例中可知,不支持电子邮件的中文格式。

删除文本括号信息

remove_parentheses

删除文本中的括号中的内容,括号类型主要包括 {}「」[]【】()()<>《》

>>> text = '【重磅新闻】特朗普选举失利'
>>> res = jionlp.remove_parentheses(text)
>>> print(res)

# ['特朗普选举失利']
  • 若括号仅只有半个,则不做处理

删除文本中的 URL

remove_url

删除文本中的 url 信息,一般用于将其当做无关噪声,处理分析数据。

>>> text = '让我这个手机知乎党来终结这个问题吧!http://link.ipaiban.com/#手机文字链接生成器!'
>>> res = jionlp.remove_url(text)
>>> print(res)

# '让我这个手机知乎党来终结这个问题吧!#手机文字链接生成器!'
  • 若整个字符串全部为 URL,则仅返回空字符串

删除文本中的 IP 地址

remove_ip_address

删除文本中的 IP 信息,一般用于将其当做无关噪声,处理分析数据。

>>> text = 'https://10.28.104.169/pdf/2004.03705.pdf'
>>> res = jionlp.remove_ip_address(text)
>>> print(res)

# 'https:///pdf/2004.03705.pdf'
  • 一般首先删除 URL,然后删除 IP 地址。否则可能如上例造成 URL 格式错误。

删除文本中的身份证号

remove_id_card

删除文本中的身份证信息,一般用于将其当做无关噪声,处理分析数据。

>>> text = '此人身份证号是 21040319560330098x,曾经...'
>>> res = jionlp.remove_id_card(text)
>>> print(res)

# '此人身份证号是 ,曾经...'

删除文本中的 QQ 号

remove_qq

删除文本中的 QQ 号信息,一般用于将其当做无关噪声,处理分析数据。

>>> text = '你加一下我的QQ: 123410942'
>>> res = jionlp.remove_qq(text)
>>> print(res)

# '你加一下我的QQ: '
  • 该方法中提供了严格匹配 qq 字符的规则,采用 strict(bool) 参数实现

删除文本中的 html 标签

remove_html_tag

删除文本中的 html 信息,一般用于将其当做无关噪声,处理分析数据。

>>> text = '''<!-- '"` -->中国<!-- </textarea>美国经济风险</xmp> -->go to the airport<form class="logout-form" action="/logout" accept-charset="UTF-8" method="post">'''
>>> res = jionlp.remove_html_tag(text)
>>> print(res)

# '中国<!-- 美国经济风险 -->go to the airport'
  • 该方法中无法删除包含有中文字符的 html 标签,出于此类标签依然包含有效信息的考虑。

删除电话号码

删除文本中的电话号码信息

>>> import jionlp as jio
>>> text = '有疑问请联系张小姐18340234920,或拨打(028)58291283。。' 
>>> phones = jio.remove_phone_number(text, detail=True))

# '有疑问请联系张小姐,或拨打。。' 

删除文本中的异常字符

remove_exception_char

删除文本中的异常字符,一般用于剔除无关噪声,处理分析数据。

>>> text = '''中国人民坚强伟大√~~'''
>>> res = jionlp.remove_exception_char(text)
>>> print(res)

# '中国人民坚强伟大~~'
  • 该方法默认保留常用的标点、英文字母、多种形式编码的数字(如全角12,①等)、常用数学物理单位,汉字集。
  • 该方法默认删除不常见的符号(如︻Ù等)、日文、俄文、希腊字母、不常见的数学物理单位与运算符。不常见的中文字符。unicode 编码的扩展集等。
  • 正则表达式位于 JioNLP/jionlp/rule/JioNLP/jionlp/rule 中的 EXCEPTION_PATTERN,如有特殊需求可以自行修改。

清洗文本

clean_text

清洗文本,步骤包括去除 html 标签、去除异常字符、去除冗余字符、去除括号补充内容、去除 URL、去除 E-mail、去除电话号码,将全角字母数字空格替换为半角,一般用于将其当做无关噪声,处理分析数据。

>>> text = '''<p><br></p>       <p><span>在17日举行的十三届全国人大一次会议记者会上,环境保护部部长李干杰就“打好污染防治攻坚战”相关问题回答记者提问。李干杰表示
,打好污染防治攻坚战,未来将聚焦“围绕三类目标,突出三大领域,强化三个基础”开展具体工作。</span></p><p><span>顶层设计聚焦“三个三”</span></p><p><span>党的十八大以来>,我国生态环境保护工作乃至整个生态文明建设工作,决心之大、力度之大、成效之大前所未有,取得了历史性成就,发生了历史性变革。(责任编辑:唐小林)联系电话:13302130583,邮箱:[email protected]~~~~'''
>>> res = jionlp.clean_text(text)
>>> print(res)
>>> print(jionlp.clean_text.__doc__)

# ' 在17日举行的十三届全国人大一次会议记者会上,环境保护部部长李干杰就“打好污染防治攻坚战”相关问题回答记者提问。李干杰表示,打好污染防治攻坚战,未来将
聚焦“围绕三类目标,突出三大领域,强化三个基础”开展具体工作。顶层设计聚焦“三个三”党的十八大以来,我国生态环境保护工作乃至整个生态文明建设工作,决心之大、力度之大、>成效之大前所未有,取得了历史性成就,发生了历史性变革。联系电话:,邮箱:~'
  • 去除异常字符主要指由于非 UTF-8 编码造成的异常字符,如“板簳浠?拷涔”等
  • 去除冗余字符主要指文本中有多个连续的空格,“~~~~”等重复冗余信息,缩减为1个字符。
  • 该方法中的所有关键字参数均为 bool 型,支持选择控制是否去除相应类型的数据

金额数字转汉字

money_nnum2char

给定一条数字金额,返回其汉字大写结果。

>>> import jionlp as jio
>>> num = 120402810.03
>>> print(jio.money_num2char(num, sim_or_tra='tra'))
>>> num = '38,009.0'
>>> print(jio.money_num2char(num, sim_or_tra='sim'))

# 壹亿贰仟零肆拾萬贰仟捌佰壹拾點零叁
# 三万八千零九
  • sim_or_tra('sim'|'tra')参数控制返回的汉字数字为“一”或“壹”。
  • 最多支持12位整数位数字,即“千亿”