【问题标题】:What is regex for website domain to use in tokenizing while keeping punctuation apart from words?什么是网站域的正则表达式用于标记化,同时将标点符号与单词分开?
【发布时间】:2017-02-22 19:21:05
【问题描述】:

这是正常输出:

我想要的是将域名保留为单个令牌。例如:“https://www.twitter.com”应保留为单个令牌。

我的代码:

import nltk
from nltk.tokenize.regexp import RegexpTokenizer

line="My website: http://www.cartoon.com is not accessible."
pattern = r'^(((([A-Za-z0-9]+){1,63}\.)|(([A-Za-z0-9]+(\-)+[A-Za-z0-9]+){1,63}\.))+){1,255}$'
tokeniser=RegexpTokenizer(pattern)

print (tokeniser.tokenize(line))

输出:

[]

我做错了什么?有更好的域名正则表达式吗?

编辑:特殊字符必须保留为单独的标记,就像上面的示例一样,标记化必须分开 ('website' , ':')。

【问题讨论】:

  • 有点懂,一直在this上用,不知道怎么用!
  • 也许tokeniser=RegexpTokenizer(r'\S+') 只抓取非空白块就足够了。
  • @WiktorStribiżew,这很好!但我仍然需要将特殊字符分隔为标记。例如: ('accessible' , '.')
  • 请在问题中添加这些详细信息。

标签: python regex nltk tokenize


【解决方案1】:

你可以使用

tokeniser=RegexpTokenizer(r'\b(?:http|ftp)s?://\S*\w|\w+|[^\w\s]+')

regex demo

详情

  • \b - 前导词边界(前面必须有一个非词字符...)
  • (?:http|ftp)s?:// - 一个协议,http/httpsftp/ftps
  • \S* - 0+ 个非空白符号
  • \w - 一个单词字符(=字母/数字/_
  • | - 或
  • \w+ - 1 个或多个单词字符
  • | - 或
  • [^\w\s]+ - 1 个或多个非单词字符,不包括空格。

【讨论】:

    【解决方案2】:

    使用“标准”域正则表达式

    import re
    line="My website: http://www.cartoon.com is not accessible."
    print(re.findall('http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+', line))
    

    返回:['http://www.cartoon.com']

    也适用于 99% 的域名

    【讨论】:

    • 最后的十六进制部分是干什么用的?
    猜你喜欢
    • 2020-01-07
    • 2014-03-24
    • 1970-01-01
    • 2013-11-22
    • 2012-07-27
    • 1970-01-01
    • 1970-01-01
    • 2011-09-06
    相关资源
    最近更新 更多