Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Python中提取字符串的某些部分?_Python_String - Fatal编程技术网

如何在Python中提取字符串的某些部分?

如何在Python中提取字符串的某些部分?,python,string,Python,String,假设我有三条线: abc534loif tvd645kgjf tv96fjbd\U gfgf 和三份清单: 开头仅捕获字符串“名称”的第一部分 middle仅捕获数字 end仅包含数字部分后面的其余字符 如何以最有效的方式完成此任务?使用正则表达式 >>> import re >>> strings = 'abc534loif tvd645kgjf tv96fjbd_gfgf'.split() >>> for s in strings:

假设我有三条线:

abc534loif

tvd645kgjf

tv96fjbd\U gfgf

和三份清单:

  • 开头
    仅捕获字符串“名称”的第一部分
  • middle
    仅捕获数字
  • end
    仅包含数字部分后面的其余字符

如何以最有效的方式完成此任务?

使用正则表达式

>>> import re
>>> strings = 'abc534loif tvd645kgjf tv96fjbd_gfgf'.split()
>>> for s in strings:
...   for match in re.finditer(r'\b([a-z]+)(\d+)(.+?)\b', s):
...     print match.groups()
... 
('abc', '534', 'loif')
('tvd', '645', 'kgjf')
('tv', '96', 'fjbd_gfgf')

使用正则表达式

>>> import re
>>> strings = 'abc534loif tvd645kgjf tv96fjbd_gfgf'.split()
>>> for s in strings:
...   for match in re.finditer(r'\b([a-z]+)(\d+)(.+?)\b', s):
...     print match.groups()
... 
('abc', '534', 'loif')
('tvd', '645', 'kgjf')
('tv', '96', 'fjbd_gfgf')

我会使用常规的表达方式,比如:

(?P<beginning>[^0-9]*)(?P<middle>[^0-9]*)(?P<end>[^0-9]*)
(?P[^0-9]*)(?P[^0-9]*)(?P[^0-9]*))
然后拉出三个匹配的部分

import re 

m = re.match(r"(?P<beginning>[^0-9]*)(?P<middle>[^0-9]*)(?P<end>[^0-9]*)", "abc534loif")
m.group('beginning')
m.group('middle')
m.group('end')
重新导入
m=重新匹配(r“(?P[^0-9]*)(?P[^0-9]*)(?P[^0-9]*)”,“abc534loif”)
m、 组('开始')
m、 组(‘中间’)
m、 组(“结束”)

我会使用常规表达式,如:

(?P<beginning>[^0-9]*)(?P<middle>[^0-9]*)(?P<end>[^0-9]*)
(?P[^0-9]*)(?P[^0-9]*)(?P[^0-9]*))
然后拉出三个匹配的部分

import re 

m = re.match(r"(?P<beginning>[^0-9]*)(?P<middle>[^0-9]*)(?P<end>[^0-9]*)", "abc534loif")
m.group('beginning')
m.group('middle')
m.group('end')
重新导入
m=重新匹配(r“(?P[^0-9]*)(?P[^0-9]*)(?P[^0-9]*)”,“abc534loif”)
m、 组('开始')
m、 组(‘中间’)
m、 组(“结束”)

我想要这样的东西:

>>> import re
>>> l = ['abc534loif', 'tvd645kgjf', 'tv96fjbd_gfgf']
>>> regex = re.compile('([a-z_]+)(\d+)([a-z_]+)')
>>> beginning, middle, end = zip(*[regex.match(s).groups() for s in l])
>>> beginning
('abc', 'tvd', 'tv')
>>> middle
('534', '645', '96')
>>> end
('loif', 'kgjf', 'fjbd_gfgf')

我想要这样的东西:

>>> import re
>>> l = ['abc534loif', 'tvd645kgjf', 'tv96fjbd_gfgf']
>>> regex = re.compile('([a-z_]+)(\d+)([a-z_]+)')
>>> beginning, middle, end = zip(*[regex.match(s).groups() for s in l])
>>> beginning
('abc', 'tvd', 'tv')
>>> middle
('534', '645', '96')
>>> end
('loif', 'kgjf', 'fjbd_gfgf')

这是一种与语言无关的方法,旨在提高效率:

  • 找到字符串中的第一个数字并保存其位置
    p0
  • 查找字符串中的最后一位数字并保存其位置
    p1
  • 将子字符串从
    0
    提取到
    p0-1
    开头
  • 将子字符串从
    p0
    p1
    提取到
    middle
  • 将子字符串从
    p1+1
    提取到
    length-1
    end

  • 这是一种与语言无关的方法,旨在提高效率:

  • 找到字符串中的第一个数字并保存其位置
    p0
  • 查找字符串中的最后一位数字并保存其位置
    p1
  • 将子字符串从
    0
    提取到
    p0-1
    开头
  • 将子字符串从
    p0
    p1
    提取到
    middle
  • 将子字符串从
    p1+1
    提取到
    length-1
    end

  • 我猜你在寻找:


    我猜你在寻找:


    为什么它需要高效?还有,到目前为止你试过什么?还有,你只有一个这样的字符串吗?那么,为什么要列出这些清单?为什么需要有效率?还有,到目前为止你试过什么?还有,你只有一个这样的字符串吗?为什么要列出这些?其中一个字符串中有一个下划线。也许\D比[a-zA-Z]更好?其中一个字符串中有下划线。也许\D会比[a-zA-Z]更好?它应该是(?P[0-9]*),也就是说,没有“^”匹配中间部分,对吗?使用“+”可能比使用“*”更好。它应该是(?P[0-9]*),即不使用“^”来匹配中间部分,对吗?使用“+”可能比使用“*”更好。
    re.split(r'(\d+),s)
    ?这是一个好主意,如果已知
    s
    的格式正确(即不在行中添加其他垃圾邮件),使用
    re.split(r'(\d+),s)
    ,这是一个好主意,如果已知
    s
    的格式正确(即未在行中添加其他垃圾邮件),则这不如正则表达式那么健壮。例如,对于像
    “abc123spam456def”
    @wim这样的非匹配项,它将失败:如果您不允许错误输入,它同样健壮。如何过滤错误输入。。使用正则表达式?;)@wim:通过规范(如合同设计)。@wim-规范(问题)明确要求两件事:解析字符串的精确格式、效率。我在所有问题上都同意尼克拉斯的观点。我们可以同意,这给了我们和输入一样好的输出,或者如果找不到数字(根据合同),就失败了。这不如正则表达式那么健壮。例如,对于像
    “abc123spam456def”
    @wim这样的非匹配项,它将失败:如果您不允许错误输入,它同样健壮。如何过滤错误输入。。使用正则表达式?;)@wim:通过规范(如合同设计)。@wim-规范(问题)明确要求两件事:解析字符串的精确格式、效率。我在所有问题上都同意尼克拉斯的观点。我们可以同意,这给了我们与输入一样好的输出,或者如果没有找到数字(每个合同)就会失败。使用
    zip(*re.findall(r'\b(\w+?)(\d+(\w+),strs))
    生成3个列表:)使用
    zip(*re.findall(r'\b(\w+)(\d+)(\w+),strs))
    生成3个列表:)