【问题标题】:Regular expressions and bigrams正则表达式和二元组
【发布时间】:2021-06-30 13:59:43
【问题描述】:

我用空格替换标点符号:

import re
sentence = ...
output = re.sub(r'[^\w\s]', ' ', sentence)

我有两个问题:

  1. 我想将其更改为允许用连字符分隔的双字:例如 "double-barreled" 应保留为 "double-barreled" 而不是 "double barreled"。实施此更改的最快方法是什么?

  2. 稍后,我想用空格替换任何不包含字母或数字的单词,也考虑双字。例如:

    "Tokyo2020" > " "

    "covid-19" > "covid-19"

    "cov!d-19" > " "

    "Oompa-L00mpa" > " "

    有什么聪明的方法可以用正则表达式来实现吗?

【问题讨论】:

  • 改用可接受字符的集合可能更实用,例如[a-zA-Z][a-zA-Z\d\-]+
  • 对于 1:output = re.sub(r'[^\w\s-]', ' ', sentence)
  • SO 指导方针说一次问一个问题。我知道这些可能看起来像相关的问题,但实际上 2 与 1 完全不同,因为它处理的是单词,而不是字符,我建议您单独发布。

标签: python regex string


【解决方案1】:

您可以使用否定前瞻来断言该单词不只包含数字或单词字符而不是数字和 _ 由连字符分隔的部分。

(?<!\S)(?!(?:\d+|[^\W\d_]+)(?:-(?:\d+|[^\W\d_]+))*(?!\S))\S+
  • (?&lt;!\S)左边的空白边界
  • (?! 负前瞻
    • (?:\d+|[^\W\d_]+) 匹配没有数字的数字或单词字符和_
    • (?:非捕获组整体重复
      • -(?:\d+|[^\W\d_]+) 匹配 - 和之前一样的模式
    • )*关闭非捕获组并可选择重复
    • (?!\S) 在右侧声明一个空白边界
  • ) 关闭前瞻
  • \S+ 匹配 1+ 个非空白字符

Regex demo | Python demo

import re
 
pattern = r"(?<!\S)(?!(?:\d+|[^\W\d_]+)(?:-(?:\d+|[^\W\d_]+))*(?!\S))\S+"
 
s = ("Tokyo2020\n"
    "Tokyo!2020\n"
    "covid-19\n"
    "cov!d-19\n"
    "Oompa-L00mpa\n"
    "double-barreled\n"
    "double barreled\n"
    "test-t9")
 
result = re.sub(pattern, "[ ]", s)
print(result)

输出([ ] 可以是空格)

[ ]
[ ]
covid-19
[ ]
[ ]
double-barreled
double barreled
[ ]

【讨论】:

  • 感谢您的回复。假设单个单词没问题(即“Tokyo2020”仍然是“Tokyo2020”但“Tokyo!2020”变成“”)我应该如何更改模式?
  • @LJG 然后你可以添加!也作为可能介于使用字符类之间的字符。见regex101.com/r/aJnUey/1
  • 对不起,我没有说清楚。我的意思是单个标记只能由字母和数字组成(然后没有符号)
  • @LJG Tokyo!2020 应该变成什么?现在它正在被删除,因为它是 word that does not contain either only letters or only numbers
  • "Tokyo!2020" 应该被删除,因为它包含一个符号 (!)。我意识到在我的文本中存在包含字母和数字(但不是符号)的单个标记,因此它们是有效的
【解决方案2】:

第一季度:

这个正则表达式[^\P{P}-]+ 捕获除破折号以外的所有标点符号,\B-\B 捕获未被单词边界包围的破折号。您可以使用这两个正则表达式的组合来替换标点符号,除了 dashbes 像这样绑定两个单词。

[^\P{P}-]+|(\B-\B)

第二季度:

如果破折号之前的第一个单词不包含数字,则此正则表达式可以捕获场景。

(^\w+)(\b-\b)(\d+|\D+)$

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-17
    • 2020-03-12
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多