gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 09:48:48 24 4
gpt4 key购买 nike

我想在 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 返回预期输出的正则表达式吗?

最佳答案

您只能删除字符串末尾的数字和点子字符串

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+ 个空格(注意:如果这些数字可以“粘”到其他文本,请将 +(一次或多次出现)替换为 * 量词(零次或多次出现))
  • \d+ - 一位或多位数字
  • (?:\.\d+)* - 0 个或多个序列
    • \. - 一个点
    • \d+ - 一位或多位数字
  • $ - 字符串结尾。

参见 regex demo .

要对 re.findall 做同样的事情,您可以使用

# 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) #

参见 this regex demo .

但是,由于 .*? 构造,此正则表达式不够高效。这里,

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

关于python正则表达式返回空字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48762524/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com