如何从文本中删除所有字母数字单词?

Posted

技术标签:

【中文标题】如何从文本中删除所有字母数字单词?【英文标题】:How to remove all alphanumeric words from the text? 【发布时间】:2015-02-24 23:18:06 【问题描述】:

我正在尝试在 php 中编写正则表达式,它只会删除字母数字单词(包含数字的单词),但不会删除具有 punctuation 和类似特殊字符的数字(例如价格、电话数字等)。

应该删除的词:

1stH202ndO23rdNUMB3RSRüthen1Wrocław2

不应该删除的词:

0,5.5,10,$100,£65,+44,(20),123,ext:124,4.4-BSD,

这是目前为止的代码:

$text = 'To remove: 1st H20; 2nd O2; 3rd NUMB3RS; To leave: Digits: -2 0 5.5 10, Prices: $100 or £65, Phone: +44 (20) 123 ext:124, 4.4-BSD';
$pattern = '/\b\w*\d\w*\b-?/';
echo $text, preg_replace($pattern, " ", $text);

但是它会删除所有单词,包括数字、价格和电话。

到目前为止,我还尝试了以下模式:

/(\\s+\\w1,2(?=\\W+))|(\\s+[a-zA-Z0-9_-]+\\d+)/ # Removes digits, etc.
/[^(\w|\d|\'|\"|\.|\!|\?|;|,|\\|\/|\-|:|\&|@)]+/ # Doesn't work.
/(\\s+\\w1,2(?=\\W+))|(\\s+[a-zA-Z0-9_-]+\\d+)/ # Removes too much.
/[^\pL\pN-]+/u                       # It removes only special characters.
/(^[\D]+\s|\s[\D]+\s|\s[\D]+$|^[\D]+$)+/ # Removes words.
/ ?\b[^ ]*[0-9][^ ]*\b/i                 # Almost, but removes digits, price, phone.
/\s+[\w-]*\d[\w-]*|[\w-]*\d[\w-]*\s*/    # Almost, but removes digits, price, phone.
/\b\w*\d\w*\b-?/                         # Almost, but removes digits, price, phone.
/[A-Za-z0-9]*[A-Za-z][A-Za-z0-9]*/       # Almost, but removes too much.

我在 SO(它们中的大多数通常过于具体)和其他假设删除带有数字的单词的网站上发现的,但事实并非如此。

如何编写一个简单的正则表达式,可以在不涉及其他内容的情况下删除这些单词?

示例文本:

删除:1stH202ndO2; 3rdNUMB3RS;

离开:数字:-2 0 5.5 10,价格:100 美元或 65 英镑,电话:+44 (20) 123 分机:124, 4.4-BSD

预期输出:

删除:; ; ;离开:数字:-2 0 5.5 10,价格:100 美元或 65 英镑,电话:+44 (20) 123 分机:124, 4.4-BSD

【问题讨论】:

我会对空格进行拆分以获取单词数组,然后用数字检查每个单词是否包含特殊字符,如果是,则从数组中删除,然后用空格将数组内爆为胶水。它不是正则表达式,但它会更容易正确。 你期望的输入和输出是什么?你能举个简短的例子吗? @hek2mgl 我已经添加了预期的输出。 您需要(准确地)定义您的意思:“特殊字符” 【参考方案1】:

\b(?=[a-z]+\d|[a-z]*\d+[a-z]+)\w*\b\s* 替换为空怎么样?

演示:https://regex101.com/r/jA2fW3/1

图案代码:

$pattern = '/\b(?=[a-z]+\d|[a-z]*\d+[a-z]+)\w*\b\s*/i';

要匹配包含外国/重音字母的字母数字单词,请使用以下模式:

$pattern = '/\b(?=[\pL]+\d|[\pL]*\d+[\pL]+)[\pL\w]*\b\s*/i';

演示:https://regex101.com/r/jA2fW3/3

【讨论】:

工作得很好,但是诸如Rüthen1Wrocław2之类的词被删除了一半。我知道它没有在描述中预测,但很高兴拥有。我尝试为 Unicode 添加 u 修饰符,但没有按预期工作。我会尝试寻找一些解决方案。 我尝试用\pL 替换a-z 的所有实例(以匹配来自任何语言的任何类型的字母),但它似乎无法正常工作,但是这种方法有效在 hwnd 的例子中。 @kenorb 很高兴你让它工作了,虽然我能让我的工作regex101.com/r/jA2fW3/3。【参考方案2】:

您可以如下修改正则表达式以获得所需的输出。

$text = preg_replace('/\b(?:[a-z]+\d+[a-z]*|\d+[a-z]+)\b/i', '', $text);

要匹配来自任何语言的任何类型的字母,请使用 Unicode 属性\pL

$text = preg_replace('/\b(?:\pL+\d+\pL*|\d+\pL+)\b/u', '', $text);

【讨论】:

以上是关于如何从文本中删除所有字母数字单词?的主要内容,如果未能解决你的问题,请参考以下文章

sed:从文件中删除字母数字单词

如何从字母数字文本中删除前导零?

导入文本查询字母单词个数

如何从文本语料库中删除特定的单字组,但仍保留该单词的双字组?

Power Query - 删除包含小写字母的文本字符串

如何从Python中的文本中提取以字母A到L开头的单词?