【问题标题】:Finding and extracting multiple substrings in a string?查找并提取字符串中的多个子字符串?
【发布时间】:2017-02-25 23:28:24
【问题描述】:

查看afewsimilarquestions后,我无法成功地对我的数据实现子字符串拆分。对于我的具体情况,我有一堆字符串,每个字符串都有一个我需要提取的子字符串。这些字符串在一个列表中组合在一起,我的数据是 NBA 位置。我需要从每个字符串中提取位置(“PG”、“SG”、“SF”、“PF”或“C”)。有些字符串会有多个位置。这是数据。

text = ['Chi\xa0SG, SF\xa0\xa0DTD','Cle\xa0PF']

理想情况下,代码应该查看第一个字符串'Chi\xa0SG, SF\xa0\xa0DTD',并返回['SG','SF'] 这两个位置。代码应该查看第二个字符串并返回['PF']

【问题讨论】:

  • 为了清楚起见,您可以添加完整的预期输出吗?例如:这是你要找的吗? [re.findall(r'\b(PG|SG|SF|PF|C)\b', s) for s in text]

标签: python regex string substring


【解决方案1】:

heemayl 的回答是最正确的,但您可能会用逗号分隔并在每个子字符串中只保留最后两个(或在“C”的情况下,最后一个)字符。

s = 'Chi\xa0SG, SF\xa0\xa0DTD'
fin = list(map(lambda x: x[-2:] if x != 'C' else x[-1:],s.split(',')))

我目前无法测试这个,因为我在 Chromebook 上,但它应该可以工作。

【讨论】:

  • 我目前没有办法测试它,但我还是试了一下
【解决方案2】:

利用(零宽度)环视:

(?<!\w)PG|SG|SF|PF|C(?!\w)
  • (?&lt;!\w) 是零宽度负后向模式,确保所需的匹配项前面没有任何字母数字

  • PG|SG|SF|PF|C 匹配任何所需的模式

  • (?!\w) 是零宽度负前瞻模式,确保匹配后没有任何字母数字

示例:

In [7]: s = 'Chi\xa0SG, SF\xa0\xa0DTD'

In [8]: re.findall(r'(?<!\w)PG|SG|SF|PF|C(?!\w)', s)
Out[8]: ['SG', 'SF']

【讨论】:

  • 为什么不使用单词边界? r'\b(PG|SG|SF|PF|C)\b'
猜你喜欢
  • 2021-01-13
  • 1970-01-01
  • 2019-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多