如何将这些数据与regex匹配?

2024-09-27 22:48:49 发布

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

Fica outorgada, em nome da PREFEITURA MUNICIPAL DE
JUQUIÁ, CNPJ n. 46.585.964/0001-40, a autorização administrativa para interferência(s) em recursos hídricos superficiais, para
fins de rodoviário no município de JUQUIÁ, conforme abaixo
identificado:
- Travessia Aérea 01 - Afluente do Rio Juquiá - Coord.
Geográficas Latitude S 24° 19' 54,00" - Longitude o 47° 38'
54,10" - Prazo 30 anos.
- Travessia Aérea 02 - Afluente do Rio Juquiá - Coord.
Geográficas Latitude S 24° 19' 58,00" - Longitude o 47° 38'
52,20" - Prazo 30 anos.
- Travessia Aérea 03 - Afluente do Rio Juquiá - Coord.
Geográficas Latitude S 24° 19' 58,00" - Longitude o 47° 38'
52,00" - Prazo 30 anos.
- Travessia Aérea 04 - Afluente do Rio Juquiá - Coord.
Geográficas Latitude S 24° 19' 59,00" - Longitude o 47° 38'
51,70" - Prazo 30 anos.
- Travessia Aérea 05 - Afluente do Rio Juquiá - Coord.
Geográficas Latitude S 24° 19' 59,40" - Longitude o 47° 38'
51,50" - Prazo 30 anos.
- Travessia Aérea 06 - Afluente do Rio Juquiá - Coord.
Geográficas Latitude S 24° 19' 59,90" - Longitude o 47° 38'
51,30" - Prazo 30 anos. Processo DAEE 9502113 - Extrato de
Portaria 4063/19.


Second example:
Fica outorgada, em nome do DEPARTAMENTO DE ESTRADAS DE RODAGEM - DER, CNPJ n. 43.052.497/0002-85, a autorização administrativa para interferência(s) em recursos hídricos
superficiais, para fins de rodoviário no município de COTIA,
conforme abaixo identificado:
- Travessia Aérea 01 (TR-05)Estaca 248+11,50 BSTM de Ø
3,00 m - Córrego Foges (Córrego Caucaia) Km 50,491 - Coord.
Geográficas Latitude S 23° 38' 33,97" - Longitude o 47° 03'
28,67" - Prazo 30 anos.
- Travessia Aérea 02 (TR-06)Est. 275+13,70 3 Linhas de
BTTC de Ø 1,50 m
- Ribeirão da Vargem Km 51,124 - Coord. Geográficas
Latitude S 23° 38' 49,97" - Longitude o 47° 03' 32,20" - Prazo
30 anos.
- Travessia Aérea 03 (TR-07)Est. 290+11,15 BSTC de Ø
1,20 m - Afluente do Ribeirão da Vargem Km 51,420 - Coord.
Geográficas Latitude S 23° 38' 54,45" - Longitude o 47° 03'
41,39" - Prazo 30 anos.
- Travessia Aérea 04 (TR-08) Est. 307+11,00 2 Linhas de
BDTC de Ø 1,20 m
- Afluente do Ribeirão da Vargem Km 51,770 - Coord.
Geográficas Latitude S 23° 38' 57,81" - Longitude o 47° 03'
52,83" - Prazo 30 anos.
- Travessia Aérea 05 (TR-09) Est. 372+4,50 BSCC de 3,00 m
x 3,00 m - Afluente do Ribeirão da Vargem Km 53,020 - Coord.
Geográficas Latitude S 23° 39' 18,71" - Longitude o 47° 04'
34,24" - Prazo 30 anos. Processo DAEE 9822402 - Extrato de
Portaria 4068/19.

我试着匹配每个“主题”开头的数据。应该是:

(match1) - (match2) - Coord.(。。。。。。其他的)。你知道吗

其中{}将是“Travessia Aérea 01”,而{}将是“aflunte do Rio Juquiá”。你知道吗

我试着用这个表达:

- ? ?((([A-z-áàâãéèêíïóôõúç]|\d+)+ ? ? ?){1,10}) - ((([A-z-áàâãéèêíïóôõúç]|\d+)+ ? ? ?){1,10}) - Coord.

但它比我想要的匹配得多,因为匹配不会以“-Coord”结束。你知道吗


Tags: dedodareariolatitudecoordlongitude
3条回答

根据您的问题,您似乎只想提取位于特殊字符“-”和字符串“Coord”之间的两条信息

from pprint import pprint
import re

input_string = """
Fica outorgada, em nome da PREFEITURA MUNICIPAL DE
JUQUIÁ, CNPJ n. 46.585.964/0001-40, a autorização administrativa para 
interferência(s) em recursos hídricos superficiais, para
fins de rodoviário no município de JUQUIÁ, conforme abaixo
identificado:
- Travessia Aérea 01 - Afluente do Rio Juquiá - Coord.
Geográficas Latitude S 24° 19' 54,00" - Longitude o 47° 38'
54,10" - Prazo 30 anos.
- Travessia Aérea 02 - Afluente do Rio Juquiá - Coord.
Geográficas Latitude S 24° 19' 58,00" - Longitude o 47° 38'
52,20" - Prazo 30 anos.
- Travessia Aérea 03 - Afluente do Rio Juquiá - Coord.
Geográficas Latitude S 24° 19' 58,00" - Longitude o 47° 38'
52,00" - Prazo 30 anos.
- Travessia Aérea 04 - Afluente do Rio Juquiá - Coord.
Geográficas Latitude S 24° 19' 59,00" - Longitude o 47° 38'
51,70" - Prazo 30 anos.
- Travessia Aérea 05 - Afluente do Rio Juquiá - Coord.
Geográficas Latitude S 24° 19' 59,40" - Longitude o 47° 38'
51,50" - Prazo 30 anos.
- Travessia Aérea 06 - Afluente do Rio Juquiá - Coord.
Geográficas Latitude S 24° 19' 59,90" - Longitude o 47° 38'
51,30" - Prazo 30 anos. Processo DAEE 9502113 - Extrato de
Portaria 4063/19.

"""

def extract_prefecture_data(geographical_input):
  prefecture_data = re.findall(r'\s([^-]+)\s-\s([^-]+)\s-\sCoord.', geographical_input, re.IGNORECASE)
  return prefecture_data

results = extract_prefecture_data(input_string)

pprint (results)
# Outputs 
[('Travessia Aérea 01', 'Afluente do Rio Juquiá'),
('Travessia Aérea 02', 'Afluente do Rio Juquiá'),
('Travessia Aérea 03', 'Afluente do Rio Juquiá'),
('Travessia Aérea 04', 'Afluente do Rio Juquiá'),
('Travessia Aérea 05', 'Afluente do Rio Juquiá'),
('Travessia Aérea 06', 'Afluente do Rio Juquiá')]

您也可以这样做:

def extract_prefecture_data(geographical_input):
  regex = re.compile(r'\s([^-]+)\s-\s([^-]+)\s-\sCoord.', re.IGNORECASE|re.MULTILINE)
  matches = [m.groups() for m in regex.finditer(geographical_input)]
  return matches

results = extract_prefecture_data(input_string)

pprint (results)
# Outputs 
[('Travessia Aérea 01', 'Afluente do Rio Juquiá'),
('Travessia Aérea 02', 'Afluente do Rio Juquiá'),
('Travessia Aérea 03', 'Afluente do Rio Juquiá'),
('Travessia Aérea 04', 'Afluente do Rio Juquiá'),
('Travessia Aérea 05', 'Afluente do Rio Juquiá'),
('Travessia Aérea 06', 'Afluente do Rio Juquiá')]

使用re.split('\s*-\s+')获取所需字段。你知道吗

import re
with open('f0.txt', 'r', encoding='utf-8') as f:
    for line in f:
        if line.startswith('-'):
            _, Aérea, Afluente, _ = re.split(r'\s*-\s+', line)
            print(Aérea, Afluente)

印刷品:

Travessia Aérea 01 Afluente do Rio Juquiá
Travessia Aérea 02 Afluente do Rio Juquiá
Travessia Aérea 03 Afluente do Rio Juquiá
Travessia Aérea 04 Afluente do Rio Juquiá
Travessia Aérea 05 Afluente do Rio Juquiá
Travessia Aérea 06 Afluente do Rio Juquiá

你尝试的模式有很多可选部分,这使得它效率低下。你知道吗

您可以使用两个捕获组,一个a negated character class匹配的not -,或者一个没有可选部分或非贪婪量词的换行符。你知道吗

如果文本之间用空格-连字符-空格分隔,则可以按字面意思进行匹配。你知道吗

请注意,\s还匹配换行符,并在字符类matches more中使用A-z而不是[A-Za-z]。你知道吗

^- ([^\r\n-]*) - ([^\r\n-]*) - Coord\.

解释

  • ^- 字符串的开头,-和空格
  • ([^\r\n-]*)捕获组1匹配0+次不是换行符或-
  • - 逐字匹配
  • ([^\r\n-]*)捕捉第2组匹配0+次不是换行符或-
  • - 逐字匹配
  • Coord\.匹配坐标,后跟文字点

Regex demo

相关问题 更多 >

    热门问题