如何用空格匹配、计数和替换字符串,但它们不是另一个字母字符串的子字符串?

Posted

技术标签:

【中文标题】如何用空格匹配、计数和替换字符串,但它们不是另一个字母字符串的子字符串?【英文标题】:How to match, count and replace string with spaces but which are not substring of another alphabetic string? 【发布时间】:2021-12-16 16:18:04 【问题描述】:

我必须在另一个 string s2 中获取特定 string s1 的总数。其中s1 可以包含空格。但我必须确保s1 是独立的,或者是带有emojiemoticonsymbol 的子字符串。但不是带有任何 alphabetic 字符的子字符串。以下是一些例子:

假设我们要匹配一个字符串bad word

以下是应该匹配的情况:

bad word
This is a bad word.
This are bad word bad word.
This is a bad word also.
This are bad word bad word as well.
bad word:(
bad word????
bad word bad word????????

等等

以下是我们不应该匹配的情况:

This isbad word
bad wordsdsdsd
bad wordbad word

等等

bad word 应该在它是独立的或作为带有任何emoticonemoji 的子字符串时匹配,但不能作为带有任何alphabetic 字符的子字符串。

请注意,字母也可以来自其他语言。

【问题讨论】:

【参考方案1】:

我认为您只想匹配\bbad word\b,并在文本周围加上单词边界:

# -*- coding: utf-8 -*-
import re

inp = ['bad word', 'This is a bad word.', 'This is a bad word also.', 'bad word:(', 'bad word?', 'This isbad word', 'bad wordsdsdsd']
for w in inp:
    if re.search(r'\bbad word\b', w):
        print("MATCH: " + w)
    else:
        print("NO MATCH: " + w)

打印出来:

MATCH: bad word
MATCH: This is a bad word.
MATCH: This is a bad word also.
MATCH: bad word:(
MATCH: bad word?
NO MATCH: This isbad word
NO MATCH: bad wordsdsdsd

【讨论】:

对于某些输入 inp,请使用:len(re.findall(r'\bbad word\b', inp)) ...您提供的示例数据仅包含单个匹配项。 问题已更新。而且我也需要替换它,因为如果某些输入是 These are bad bad word 并且我们分别找到 badbad word ,那么它们中的两个应该匹配(我自己处理这种情况,首先匹配较大的并替换它)。因此,匹配bad word 后,计数为1,输入为This are bad ,之后匹配bad,计数为2,输入为These are (替换后)。 我上面的评论向您展示了如何获得计数。我不会更新我的答案,因为您的新样本数据只有正面案例,所以它并没有像我上面所说的那样理解这一点。 @hafiz031 但是here is a demo 如果您想查看更新的数据。 对于非英语使用这个版本:re.findall(r'(?<!\S)কথা(?!\S)', "কথা") ...顺便说一句,这不是你上面问的,也不是回答的。我强烈建议您停止更改您的问题。

以上是关于如何用空格匹配、计数和替换字符串,但它们不是另一个字母字符串的子字符串?的主要内容,如果未能解决你的问题,请参考以下文章

如何用包含空格的字符串替换列表中的项目?

如何用“-”替换多余的空格(不是空格)?

如何用另一个表中的匹配值替换/更新列中每个字符串的所有实例?

Android - 如何用另一个字符串替换部分字符串?

如何用jdbc在swing中用另一个字段替换外键?

如何用正则表达式匹配连字符?