python正则表达式返回空字符串

时间:2018-02-13 08:36:34

标签: python regex

我想在列表中提取部分字符串,该列表中没有空格,后跟python中的数字。

# INPUT
text = ['bits', 'scrap 1.2', 'bits and pieces', 'junk 3.4.2']
# EXPECTED OUTPUT
output = ['bits', 'scrap', 'bits and pieces', 'junk']

我设法使用re.sub或re.split执行此操作:

output = [re.sub(" [0-9].*", "", t) for t in text]
# OR
output = [re.split(' \d',t)[0] for t in text]

当我尝试使用re.search和re.findall时,它会返回空列表或空结果。

[re.search('(.*) \d', t) for t in text]
#[None, <_sre.SRE_Match object; span=(0, 7), match='scrap 1'>, None, <_sre.SRE_Match object; span=(0, 6), match='junk 3'>]

[re.findall('(.*?) \d', t) for t in text]
#[[], ['scrap'], [], ['junk']]

任何人都可以帮我处理可以返回re.search和re.findall的预期输出的正则表达式吗?

1 个答案:

答案 0 :(得分:4)

您只能使用

删除字符串末尾的数字和点子串
import re
text = ['bits', 'scrap 1.2', 'bits and pieces', 'junk 3.4.2']
print([re.sub(r'\s+\d+(?:\.\d+)*$', '', x) for x in text])
# => output = ['bits', 'scrap', 'bits and pieces', 'junk']

请参阅Python demo

模式是

  • \s+ - 1+个空格(注意:如果这些数字可以&#34;粘合&#34;到其他一些文本,请用{{1}替换+(一次或多次出现) }量词(零次或多次出现))
  • * - 一位或多位
  • \d+ - 0或更多序列
    • (?:\.\d+)* - 一个点
    • \. - 一位或多位
  • \d+ - 字符串结束。

请参阅regex demo

要对$ 执行相同操作,您可以使用

re.findall

请参阅this regex demo

但是,由于# To get 'abc 5.6 def' (not 'abc') from 'abc 5.6 def 6.8.9' re.findall(r'^(.*?)(?: \d[\d.]*)?$', x) # # To get 'abc' (not 'abc 5.6 def') from 'abc 5.6 def 6.8.9' re.findall(r'^(.*?)(?: \d.*)?$', x) # 构造,此正则表达式效率不高。这里,

  • .*? - 字符串开头
  • ^ - 第1组:除了换行符之外的任何零个或多个字符(使用(.*?)以匹配所有字符)尽可能少(以便可以在每个位置测试下一个可选组) )
  • re.DOTALL - 可选的非捕获组匹配
    • (?: \d[\d.]*)? - 空格
    • - 数字
    • \d - 零个或多个数字或[\d.]*字符
    • (OR). - 除了换行符之外的任何0 +字符,尽可能多
  • .* - 字符串结束。