python中正则表达式对字符串的解析
如何在python中解析此字符串 输入字符串:python中正则表达式对字符串的解析,python,regex,python-3.x,python-2.7,Python,Regex,Python 3.x,Python 2.7,如何在python中解析此字符串 输入字符串: someplace 2018:6:18:0 25.0114 95.2818 2.71164 66.8962整个网格内容设置为缺少数据 对此 输出阵列: ['someplace'、'2018:6:18:0'、'25.0114'、'95.2818'、'2.71164'、'66.8962'、'整个网格内容设置为缺少数据'] 我已经尝试过使用split(“”),但由于不清楚子字符串之间有多少空格,最后一个子字符串中可能有空格,因此这不起作用 我需要正则表达
someplace 2018:6:18:0 25.0114 95.2818 2.71164 66.8962整个网格内容设置为缺少数据
对此
输出阵列:
['someplace'、'2018:6:18:0'、'25.0114'、'95.2818'、'2.71164'、'66.8962'、'整个网格内容设置为缺少数据']
我已经尝试过使用split(“”)
,但由于不清楚子字符串之间有多少空格,最后一个子字符串中可能有空格,因此这不起作用
我需要正则表达式。如果不提供sep字符,pythonssplit(sep=None,maxslit=-1)
会将连续的空格视为一个空格并按这些空格进行拆分。您可以通过提供maxsplit值来限制要执行的拆分量:
输出:
['someplace', '2018:6:18:0', '25.0114', '95.2818', '2.71164',
'66.8962', 'Entire grid contents are set to missing data']
('someplace', '2018:6:18:0', '25.0114', '95.2818', '2.71164', '66.8962', 'Entire grid contents are set to missing data')
只要第一个文本不包含任何空格,这将起作用
如果第一个文本可能包含空格,则可以使用/优化此正则表达式解决方案:
import re
reg = re.findall(r"([^\d]+?) +?([\d:]+) +?([\d.]+) +?([\d.]+) +?([\d.]+) +?([\d.]+) +(.*)$",data)[0]
print(reg)
输出:
['someplace', '2018:6:18:0', '25.0114', '95.2818', '2.71164',
'66.8962', 'Entire grid contents are set to missing data']
('someplace', '2018:6:18:0', '25.0114', '95.2818', '2.71164', '66.8962', 'Entire grid contents are set to missing data')
使用f.e.对照您的其他数据检查/验证正则表达式(按照链接,它在样本数据上使用上述正则表达式)[A-Z]{1}[A-zA-Z]{15,45}}|[\w |::|]]+ 你可以在这里测试
根据需要修改15,45 Maxsplit也适用于re.split() 编辑: 如果第一个和最后一个文本部分不包含数字,则不需要maxsplit,也不必依赖具有连续空格的部分数:
re.split("\s+(?=\d)|(?<=\d)\s+",s)
re.split(“\s+(?=\d)|”(?由于要求不太精确,很难回答您的问题。我想我应该使用split()函数拆分行,然后在项目内容没有数字时连接项目。下面是一个适用于您的示例的片段:
def containsNumbers(s):
return any(c.isdigit() for c in s)
data = "someplace 2018:6:18:0 25.0114 95.2818 2.71164 66.8962 Entire grid contents are set to missing data"
lst = data.split()
lst2 = []
i = 0
agg = ''
while i < len(lst):
if containsNumbers(lst[i]):
if agg != '':
lst2.append(agg)
agg = ''
lst2.append(lst[i])
else:
agg += ' '+lst[i]
agg = agg.strip()
if i == len(lst) - 1:
lst2.append(agg)
i += 1
print(lst2)
def容器编号:
返回任意值(s中c的c.isdigit()值)
data=“someplace 2018:6:18:0 25.0114 95.2818 2.71164 66.8962整个网格内容设置为缺少数据”
lst=data.split()
lst2=[]
i=0
agg=''
而i
当您只给出一个输入和输出示例时,很难知道您想要什么正则表达式,这取决于您的数据的一致性。您可以通过一些简单的字符串操作进行此类拆分,或者您可能需要复杂的正则表达式。如果没有所有数据(或至少有代表性的示例),很难知道您能给我们一个规则来解释如何拆分字符串吗?例如,“将任何内容(组1)匹配到第一个子字符串(仅由数字和冒号组成)(组2),然后匹配四个十进制数(数字和句点,组3-6),然后再匹配字符串的其余部分(组7)”使用split()而不是split(“\”)。它将单词之间的更多空格视为一个空格,您可以限制剪切的数量:split(maxslit=6)。我只需要可以在split()中使用的正则表达式方法。规则是……分隔子字符串之间和最后一个子字符串内部的空格。根据子字符串之间的空格生成数组,但最后一个子字符串除外……空格数没有定义Hanks,Patrick,你是对的。我没有运行并查看python代码。我已经修改了答案,现在应该可以了。小心使用[A-z]
,它匹配z
和A
之间的字符,即左开括号、反斜杠、右闭括号、插入符号cirumflex、下划线、反勾号。请参见拟议正则表达式的[\w |::|]
部分。不需要两个
字符。另一个备注:代替[A-zA-z]
只使用[A-Z]
但要使用IGNORECASE选项。