【问题标题】:python regex if some words contain spaces如果某些单词包含空格,则python正则表达式
【发布时间】:2020-05-29 13:48:23
【问题描述】:

问题示例:

str1 = "ur a sh * tty comment ."

我需要句子中的每个单词,并想用sh***tty 替换sh * tty(用* 替换单词中的那些空格)

如果我尝试:

for word in s.split():
    print(word)

我明白了:

ur
a
sh
*
tty
comment
.

sh * tty 现在被分成 3 个单词

  1. sh
  2. *
  3. tty

但我正好需要这个词 sh * tty,所以我可以用 * 替换空格,最后变成 sh***tty。

我不能简单地用* 替换空格。如果空格在任何英文单词中(典型错误),我只需要用* 替换空格。

我也试过了:

s = "ur a sh * tty comment ."
makeBad = s.translate ({ord(c): "*" for c in " "})

但我不想替换分隔两个单词的空格。

【问题讨论】:

  • 你怎么知道单词从哪里开始? * 两边的任意两块文本?试试re.sub(r'\S+ +\* +\S+', lambda x: x.group().replace(' ', '*') , str1)。如果* 周围有单个空格,则只需re.sub(r'(\S) (\*) (\S)', '***' , str1)。
  • re.sub(r'(\S) (*) (\S)', '***' , str1) 对我来说可能会很好,但在这种情况下有时我可能会得到 sh % tty 吗?那么它就行不通了。你能稍微修改一下你的第二个代码,这样它就分配了 3 个星号,总之我会从这个列表中看到任何东西吗? "!@#$%^&()[]{};:,./?\|`~-=_+" 也是您提出的第一个解决方案?
  • 喜欢nw = r"[]\s!@#$%^&()[{};:,./<>?\\|`~=_+-]" 然后print( re.sub(rf'(\S){nw}\*{nw}(\S)', r'\1***\2' , str1) )?见ideone.com/4FLT2r
  • 对于 sh @ tty 它不起作用
  • 啊,明白了,你需要ideone.com/rtC2nb:nw = r"[]*!@#$%^&()[{};:,./<>?\\|`~=_+-]",然后是print( re.sub(rf'(\S) {nw} (\S)', r'\1***\2' , str1) )

标签: python regex replace split


【解决方案1】:

你可以使用

import re
str1 = "ur a sh * tty comment ."
nw = r"[]*!@#$%^&()[{};:,./<>?\\|`~=_+-]"
print( re.sub(rf'(\S) {nw} (\S)', r'\1***\2' , str1) )

请参阅Python demo。

在这里,图案看起来像

(\S) []*!@#$%^&()[{};:,./<>?\\|`~=_+-] (\S)

匹配

  • (\S) - 第 1 组 (\1):任何非空白字符
  • - 一个空格
  • []*!@#$%^&amp;()[{};:,./&lt;&gt;?\\|`~=_+-] - 字符形式的集合:]*!@#$%^&amp;()[{};:,./&lt;&gt;?\|`~=_+-
  • - 一个空格
  • (\S) - 第 2 组 (\2):任何非空白字符。

【讨论】:

  • 非常感谢..它有帮助..1 最后一个最坏的情况,你能帮我吗?考虑这段代码:pastebin.com/ApgHYLmF 输出是“f k u”,我想要 f**k u”或者正是我们在 dataset1 中的内容。你能为我修改该代码,以便我得到这样的输出吗?
  • 虽然我得到了错误,但代码是这样的:ideone.com/zqL6RN,我得到的输出是“need f k u”,但我正在寻找一种用 * 替换 f k 的方法,它将替换空格,你明白了吗?
  • @MobassirHossen 不知道您的匹配标准是什么。规则是什么?
  • 我也想不出一个规则,但输出是我想要的东西,但在这种情况下无法考虑一个规则,用于在我们有空格的单词内分配 *,,然后我将使用您的解决方案,但是现在我将无法删除那些没有定义任何情感的不必要的单词,例如 a,等等,我想使用 nltk 和 PorterStemmer 删除那些不必要的单词,然后使用新字符串我想用你上面提供的 sh***tty 替换“sh * tty”之类的东西
  • 刚刚找到了一个解决方案,在此类行 cmets 上使用您的正则表达式将 sh * t 转换为 sh***t,然后将该新字符串传递给 nltk 或 PorterStemmer 以删除不必要的单词,很多很多感谢您的帮助
猜你喜欢
  • 2017-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多