【问题标题】:Regex: Only want space character before and after match正则表达式:只需要匹配前后的空格字符
【发布时间】:2021-05-31 15:22:09
【问题描述】:

我正在为文本段落使用正则表达式标记器,并且我想提取在此之前和之后只有空格的所有单词。这是我的代码:

tokenizer = RegexpTokenizer('[0-9a-z][^\s\']*[a-z]')

例如,“我们没有 500 美元”这句话最终会变成“我们没有美元”。我想消除“don”,因为它不以空格结尾。我该怎么做?

【问题讨论】:

  • 使用前瞻断言:r'[0-9a-z]*?= '。结果应该是“我们有 500 个”。 "dollars" 不匹配,因为它后面没有空格。
  • @TimRoberts 这看起来像是一个错字。你的意思可能是r'[0-9a-z]*?(?=\s)'
  • 大概你在问 NLTK?我添加了nltk 标签,但请查看。
  • 同意,应该更多地说明上下文。同意海报可能意味着 nltk
  • 我很抱歉。匹配可以在没有空格(例如句号)的情况下结束。但是,我不希望比赛以撇号“'”结束。我也需要比赛以空白开头。所以这意味着我绝对想以“我们有美元”结束。我想知道以下代码是否有效: tokenizer = RegexpTokenizer('(?

标签: python regex nltk tokenize


【解决方案1】:

您可以使用积极的前瞻和后瞻来实现这一目标

代码:

重新导入

pattern = r"(?:(?<=^)|(?<=\s))([a-zA-Z0-9]+)(?:(?=\s)|(?=$))"
print(re.findall(pattern, "we don't have 500 dollars"))
print(re.findall(pattern, "Your money's no good here, Mr. Torrance"))

输出:

['we', 'have', '500', 'dollars']
['Your', 'no', 'good', 'Torrance']

你可以在这里玩这个 https://regex101.com/r/IeLC88/3

【讨论】:

  • 当我执行代码时,它返回了一个错误信息:error:look-behind requires fixed-width pattern.
  • \b 替换(?&lt;=\s|^) 可能更好。第三方regex 库将允许您使用可变宽度的lookbehinds,但我不知道移植到NLTK 上会有多容易。对于英语,这个简单的修复可能就足够了,尽管您可能真的希望对起始词边界有更灵活的定义。
  • @tripleee you are variable-width 在这里不起作用,但添加 \b 也会在混合中检测到't。相反,我创建了非捕获组和添加的替代方案以避免修复问题
  • @TanPengshiAlvin 更新了答案以包含非捕获组以及解决固定宽度问题的替代方案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-26
  • 1970-01-01
  • 1970-01-01
  • 2020-06-16
  • 1970-01-01
相关资源
最近更新 更多