Python正则表达式以非贪婪的方式匹配/选择引号内的字符串,但字符串有时包含方括号、逗号、反斜杠和拉止点

2024-09-28 03:20:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我想把这些线匹配起来 第1行: ,["0x3bad08fb87bc906f:0x74d6f6242d49ab18","SRI VIVEKANANDA MATRIC HIGHER SECONDARY SCHOOL Ambur (Spiritual, Modern Scientific Education)",null,[null,null,12.784799699999999,78.7137085] 第2行: ,["0x3bad08e4f337028d:0x5635e172ff9d7570","Sudha Nursery \u0026 Primary School",null,[null,null,12.7849528,78.7159848] 第3行: ,["0x3bad08e6a3dfe635:0x4ea2fcc42c9f7ce","As-Shukoor School",null,[null,null,12.7854174,78.7196367]

我的观察是,每行以逗号(,)开头,以方括号(])结尾,出现三次“null”,然后出现两个小数点从5到16的数字。 我只想提取引号内的字符串和末尾的两个带小数点的数字

我想了一点,但弄不清楚如何匹配引号,有时包括括号、pullstop、反斜杠、空格、逗号、减号、* 这是我完成了一半的表达式/模式

(r'^\,\[\"0x[0-9a-z]{16}:0x[0-9a-z]{16}\"\,\"(.*?)\"\,null\,\[null\,null\,(\d\d\.\d{5,16})\,(\d\d\.\d{5,16})\]')

但这不起作用。 非常感谢您的帮助


Tags: 数字null引号逗号secondaryschoolsrimodern
1条回答
网友
1楼 · 发布于 2024-09-28 03:20:39

将此正则表达式与标志re.M一起使用:

^,\["0x[a-f0-9]{16}:0x[a-f0-9]{16}","([^"]*)",null,\[null,null,(\d+\.\d{5,16}),(\d+\.\d{5,16})\]$

See Regex Demo

上述正则表达式中的大部分内容都很简单。为了匹配带引号的字符串,我假设字符串本身不包含"字符。所以我用

"([^"]*)"

。。。它匹配0个或更多双引号内的非#字符,并将这些字符放在捕获组1中。这是一个比"(.*?)"更有效的替代方案

import re

lines = """,["0x3bad08fb87bc906f:0x74d6f6242d49ab18","SRI VIVEKANANDA MATRIC HIGHER SECONDARY SCHOOL Ambur (Spiritual, Modern Scientific Education)",null,[null,null,12.784799699999999,78.7137085]
,["0x3bad08e4f337028d:0x5635e172ff9d7570","Sudha Nursery \u0026 Primary School",null,[null,null,12.7849528,78.7159848]
,["0x3bad08e6a3dfe635:0x4ea2fcc42c9f7ce","As-Shukoor School",null,[null,null,12.7854174,78.7196367]
"""

rex = re.compile(r'^,\["0x[a-f0-9]{16}:0x[a-f0-9]{16}","([^"]*)",null,\[null,null,(\d+\.\d{5,16}),(\d+\.\d{5,16})\]$', re.M)
for m in rex.finditer(lines):
    print(m[1], m[2], m[3])

印刷品:

SRI VIVEKANANDA MATRIC HIGHER SECONDARY SCHOOL Ambur (Spiritual, Modern Scientific Education) 12.784799699999999 78.7137085
Sudha Nursery & Primary School 12.7849528 78.7159848

它将不匹配第3行,因为0x4ea2fcc42c9f7ce只包含15个“半字节”(半字节)

更新

如果您假设每一行都应该匹配,并且您希望使用更宽松的正则表达式,因为行中可能存在一些变化(例如,插入的空格),那么您可能希望使用它(带有标志re.M):

^,[^[]*\["0x[a-f0-9]+:0x[a-f0-9]+"[^"]*"([^"]*)"\D*(\d+\.\d{5,16}),(\d+\.\d{5,16})
  1. ^匹配行的开头
  2. [^[]*匹配0个或多个非[字符
  3. [匹配一个[
  4. "0x[a-f0-9]+:0x[a-f0-9]+"匹配由:分隔的任意长度的带引号的十六进制字符串
  5. [^"]*匹配0个或多个非"字符
  6. "([^"]*)"匹配捕获组1中带引号的字符串
  7. \D*匹配0个或多个非数字
  8. (\d+\.\d{5,16})匹配捕获组2中的十进制数
  9. ,匹配一个,
  10. (\d+\.\d{5,16})匹配捕获组3中的十进制数

See Regex Demo

import re

lines = """,["0x3bad08fb87bc906f:0x74d6f6242d49ab18","SRI VIVEKANANDA MATRIC HIGHER SECONDARY SCHOOL Ambur (Spiritual, Modern Scientific Education)",null,[null,null,12.784799699999999,78.7137085]
,["0x3bad08e4f337028d:0x5635e172ff9d7570","Sudha Nursery \u0026 Primary School",null,[null,null,12.7849528,78.7159848]
,["0x3bad08e6a3dfe635:0x4ea2fcc42c9f7ce","As-Shukoor School",null,[null,null,12.7854174,78.7196367]
"""

rex = re.compile(r'^,[^[]*\["0x[a-f0-9]+:0x[a-f0-9]+"[^"]*"([^"]*)"\D*(\d+\.\d{5,16}),(\d+\.\d{5,16})', re.M)
for m in rex.finditer(lines):
    print(m[1], m[2], m[3])

印刷品

SRI VIVEKANANDA MATRIC HIGHER SECONDARY SCHOOL Ambur (Spiritual, Modern Scientific Education) 12.784799699999999 78.7137085
Sudha Nursery & Primary School 12.7849528 78.7159848
As-Shukoor School 12.7854174 78.7196367

更新2

如果你真的想宽大些,假设每一行都应该匹配:

^[^"]*"[^"]*"[^"]*"([^"]*)"\D*(\d+\.\d+)\D*(\d+\.\d+)
  1. ^匹配行的开头
  2. [^"]*"[^"]*"跳到并匹配第一个字符串
  3. [^"]*"([^"]*)"跳到并匹配第二个字符串,并放入捕获组1
  4. \D*(\d+\.\d+)跳到下一个数字并捕获捕获组2中的十进制数
  5. \D*(\d+\.\d+)跳到下一个数字并捕获捕获组3中的十进制数
import re

lines = """,["0x3bad08fb87bc906f:0x74d6f6242d49ab18","SRI VIVEKANANDA MATRIC HIGHER SECONDARY SCHOOL Ambur (Spiritual, Modern Scientific Education)",null,[null,null,12.784799699999999,78.7137085]
,["0x3bad08e4f337028d:0x5635e172ff9d7570","Sudha Nursery \u0026 Primary School",null,[null,null,12.7849528,78.7159848]
,["0x3bad08e6a3dfe635:0x4ea2fcc42c9f7ce","As-Shukoor School",null,[null,null,12.7854174,78.7196367]
"""

rex = re.compile(r'^[^"]*"[^"]*"[^"]*"([^"]*)"\D*(\d+\.\d+)\D*(\d+\.\d+).*$', re.M)
for m in rex.finditer(lines):
    print(m[1], m[2], m[3])

相关问题 更多 >

    热门问题