【问题标题】:Finding letters in string, not followed by a number... possibly using RE?在字符串中查找字母,而不是数字...可能使用 RE?
【发布时间】:2014-02-11 17:44:57
【问题描述】:

我正在尝试从字符串中提取不跟随或不直接跟随数字的字母。

这是一个示例字符串:

string = "ts0060_LOD-70234_lr2_billboards_rgba_over_s3d_lf_v5_2Kdciufa_lnh"

这是我目前所拥有的:

re.findall(r"[a-z]+", string.lower())

给出这个结果:

['ts', 'lod', 'lr', 'billboards', 'rgba', 'over', 's', 'd', 'lf', 'v', 'kdciufa', 'lnh']

...但我正在寻找的结果更像是这样的:

['lod', 'billboards', 'rgba', 'over', 'lf', 'lnh']

有没有办法使用正则表达式来实现这一点?

非常感谢,

【问题讨论】:

标签: python regex string


【解决方案1】:

使用消极的环顾四周:

re.findall(r"(?<![\da-z])[a-z]+(?![\da-z])", string.lower())

这匹配不是紧跟在更多字母或数字之前或之后的小写字母。

演示:

>>> import re
>>> string = "ts0060_LOD-70234_lr2_billboards_rgba_over_s3d_lf_v5_2Kdciufa_lnh"
>>> re.findall(r"(?<![\da-z])[a-z]+(?![\da-z])", string.lower())
['lod', 'billboards', 'rgba', 'over', 'lf', 'lnh']

【讨论】:

  • 如果您知道分隔符将是_-,您就不能利用这些知识来完全避免使用环视吗?
  • 类似:[_-]([a-z]+)[_-] 虽然这不处理初始的非下划线/破折号或结束的情况。但无论如何,我更喜欢你的回答。
  • @BlackVegetable:因为那样的话那些会被包含在输出中,或者你必须添加一个组。最后一个必需的匹配不以_- 结尾。你可以解决这个问题,但无论如何你最终会得到比环顾四周更丑陋的东西。
  • 天才...谢谢。我对正则表达式还是很陌生,这非常有用!
【解决方案2】:

使用findall 的替代方法是将字符串拆分为单个单词,然后过滤掉任何包含非字母字符的单词。

import re

string = "ts0060_LOD-70234_lr2_billboards_rgba_over_s3d_lf_v5_2Kdciufa_lnh"

#split on non-alphanumeric characters
words = re.split("[^a-z0-9]", string.lower())
print "words:", words

filtered_words = filter(str.isalpha, words)
print "filtered words:", filtered_words

结果:

words: ['ts0060', 'lod', '70234', 'lr2', 'billboards', 'rgba', 'over', 's3d', 'lf', 'v5', '2kdciufa', 'lnh']
filtered words: ['lod', 'billboards', 'rgba', 'over', 'lf', 'lnh']

【讨论】:

  • 这是一个非常好的解决方案,并且更具可读性。 +1
猜你喜欢
  • 1970-01-01
  • 2016-01-02
  • 1970-01-01
  • 2012-10-27
  • 1970-01-01
  • 2016-02-28
  • 2022-06-12
  • 2022-06-10
  • 2015-02-22
相关资源
最近更新 更多