Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/310.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_Regex_Python 3.x_Python 2.7 - Fatal编程技术网

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(“”),但由于不清楚子字符串之间有多少空格,最后一个子字符串中可能有空格,因此这不起作用 我需要正则表达

如何在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(“”)
,但由于不清楚子字符串之间有多少空格,最后一个子字符串中可能有空格,因此这不起作用

我需要正则表达式。

如果不提供sep字符,pythons
split(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选项。