【问题标题】:Match all the words of an exact length separated by comma匹配以逗号分隔的精确长度的所有单词
【发布时间】:2019-01-14 03:27:06
【问题描述】:

我有一个这种格式的字符串:

text = "Louis,Edward,John,Billy,Don,Dean"

我想从这个字符串中提取长度在 2 到 4 之间的所有名称。如果列表中只有一个名称,则没有逗号:

text = "Louis"

我正在尝试使用这个正则表达式:

import re
pattern = re.compile('(\w{2,4})(,\w{2,4})*')
search_result = pattern.findall('Louis,Edward,John,Billy,Don,Dean')
print(search_result)

结果是:

[('Loui', ''), ('Edwa', ''), ('rd', ',Bill'), ('Don', ',Dean')]

虽然我希望是:

['John', 'Don','Dean']

我做错了什么?

【问题讨论】:

  • “Billy”的长度为 5。您确定这应该在结果中吗?
  • @coldspeed 你是对的,已编辑。谢谢。

标签: python regex python-3.x


【解决方案1】:

修复您的正则表达式,您可以在\w{2,4} 周围添加单词边界。

re.findall(r'\b\w{2,4}\b', text)
# ['John', 'Don', 'Dean']

或者,

p = re.compile(r'\b\w{2,4}\b')
p.findall(text)
# ['John', 'Don', 'Dean']

这将确保长度为 2-4 的名称仅在它们不是较大字符串的一部分时才匹配。

【讨论】:

  • 比我的好。 +1
【解决方案2】:

RegEx 似乎不需要此任务。您可以尝试用逗号分割字符串,然后使用列表理解对其进行过滤:

names = 'Louis,Edward,John,Billy,Don,Dean'

result = [name for name in names.split(',') if 2 <= len(name) <= 4]

['John', 'Don', 'Dean']

【讨论】:

  • 感谢您的建议,但我需要使用正则表达式来实现。
  • @coldspeed 哦,对不起!我在编辑答案时没有看到它。我应该删除它吗?
  • @coldspeed 好的,我回滚了。
【解决方案3】:

您也可以这样做:

text = "Louis,Edward,John,Billy,Don,Dean"
result = list(filter(lambda x:2<=len(x)<=4,text.split(",")))

You can try it here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多