python - 从长字符串中提取特定的字母数字模式
问题描述
我想从类似的文本中匹配组号及其行组:
domain 1
654789 text (one or more lines)
domain 2
125478 text (one or more lines)
我想得到:
domain 1 654789
domain 2 125478
我的代码是:
import re
from re import match
domain = re.compile(r'[-+]?domain')
terminal = re.compile(r'^[0-9][0-9]{6}(?!\d)')
with open('in_texto.txt') as file_in:
for linea in file_in:
for match in re.finditer(domain, linea):
dom = re.findall('\d+', linea)[0]
print(dom)
for lineas in file_in:
for match in re.finditer(terminal, lineas):
print(dom+" "+lineas, end='')
但它只打印:
654789 text
956478 text
125478 text
.....
我该如何解决这个问题?
解决方案
这是使用该模块的解决方案regex
(它实际上与使用完全相同re
)
# import regex # or re - then subsitute regex.split for re.split etc.
# string = 'domain 1 \ntotal.....\n======= \n\n654789 text \n956478 text\ndomain 2\n======= \ncolumn..... \n\n\n125478 text \n456987 text '
domains = regex.split(r'domain \d+', string)
out = list()
for k in range(1, len(domains)):
out.extend(['domain {} {}'.format(k, d) for d in regex.findall(r'\d+(?=\s*text)', domains[k])])
out
# ['domain 1 654789', 'domain 1 956478', 'domain 2 125478', 'domain 2 456987']
- 首先,我们按域拆分原始文本字符串。
- 然后对于每个域,我们使用 regex 获取数字
\d+(?=\s*text)
。 - 我们最终处理提取的数字,添加相应的域并将结果附加到我们的列表中。
推荐阅读
- javascript - 如何拥有动态 .env 文件而不是硬编码的 localhost?
- java - 不兼容的类型:boolean 不能转换为 int
- android - 如何将整个设备中的状态栏颜色设置为默认手机应用程序中的绿色?
- pandas - str.contains 找不到部分匹配项
- javascript - Firefox 中 HTML 横幅上的可点击(Taparea)打开 Outlook 以及一个新选项卡
- c# - Asp.Net Core 中的 EF Core 异步可扩展性
- python - Pandas:如何创建一个包含月内每个工作日数的新列?
- oracle - 为什么这个检查约束在检查长度时不起作用?
- c# - 在c#中检测按键
- c++ - 如何在 Code::Blocks IDE 中打开文件夹?