【问题标题】:Python String DissectionPython 字符串剖析
【发布时间】:2016-07-02 08:20:56
【问题描述】:

问题来了:

  1. 将输入字符串替换为以下内容:第一个和最后一个字符,以两者之间不同字符的计数分隔。
  2. 输入字符串中的任何非字母字符都应出现在输出字符串中的原始相对位置。

这是我到目前为止的代码:

word = input("Please enter a word: ")
first_character = word[0]
last_character = word[-1]
unique_characters = (list(set(word[1:-1])))
unique_count = str(len(unique_characters))
print(first_character[0],unique_count,last_character[0])

对于第二部分,我曾考虑过使用正则表达式,但是我无法完全理解正则表达式,因为它不是我曾经使用过的东西。

【问题讨论】:

  • 类似this?我猜Testers应该换成T5s
  • 不,我们只想要第一个和最后一个字符之间的唯一字符。所以 T4s 是正确的。
  • 好,然后ideone.com/IaYfBZ? len(''.join(set(m.group(2)))) 应该得到唯一字符的计数。
  • 一个字母的单词呢?他们应该保持原样,对吧? 2个字母的单词呢? "Ts" -> T0sTs?

标签: regex string python-3.5


【解决方案1】:

你可以使用

import re
pat = r"\b([^\W\d_])([^\W\d_]*)([^\W\d_])\b"
s = "Testers"
print(re.sub(pat, (lambda m: "{0}{1}{2}".format(m.group(1), len(''.join(set(m.group(2)))), m.group(3))), s))

请参阅IDEONE demo

正则表达式分解:

  • \b - 单词边界(如果您测试单个字符串,请使用 ^
  • ([^\W\d_]) - 第 1 组捕获任何 ASCII 字母(如果您也需要匹配 Unicode,请使用 re.U 标志)
  • ([^\W\d_]*) - 第 2 组捕获零个或多个字母
  • ([^\W\d_]) - 第 3 组在...捕获一封信
  • \b - 尾随单词边界(如果您处理单个字符串,请替换为 $

在替换模式中,len(''.join(set(m.group(2)))) 正在计算唯一字母出现的次数 (see this SO post)。

如果您需要处理像Ts > Ts 这样的两个字母的单词,您可以在第二组中将* 替换为+ 量词。

【讨论】:

  • 我用T3sters 的字符串进行了测试,并期待T34s 作为输出,因为非字母字符应该保留在字符串中,但我的原始输入作为输出。
  • 因此,您不要期望单词是完整的单词。我知道了。只需取出\bs。但是,T3sters 将产生T3s3s。见this demo。此外,对单词的要求是它应该是由任何非字母字符分隔的字母字符序列。因此,T3sters 不能产生T34s,因为3 不是字母字符。
猜你喜欢
  • 2012-01-31
  • 1970-01-01
  • 2020-01-08
  • 1970-01-01
  • 2015-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多