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