正则表达式和bigram

2024-07-04 08:46:44 发布

您现在位置:Python中文网/ 问答频道 /正文

要使用空格替换标点符号,我使用:

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">" "

    有没有聪明的方法用正则表达式来实现这一点


Tags: importgtreoutput字母方式数字字符
2条回答

Q1:

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

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

Q2:

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

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

您可以使用负前瞻来断言单词不只是由数字或单词字符组成,而不是由数字和用连字符分隔的部分组成

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

Regex demoPython 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
[ ]

相关问题 更多 >

    热门问题