使用正则表达式拆分,但使用分隔符的第一个字符

2024-04-26 07:52:21 发布

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

我有这样一个正则表达式:"[a-z|A-Z|0-9]: ",它将匹配一个字母数字字符、冒号和空格。我想知道如何拆分字符串,但在拆分的第一个结果中保留字母数字字符。我无法更改正则表达式,因为在某些情况下,字符串在冒号和空格之前会有特殊字符

例如:

line = re.split("[a-z|A-Z|0-9]: ", "A: ") # Result: ['A', '']
line = re.split("[a-z|A-Z|0-9]: ", ":: )5: ") # Result: [':: )5', '']
line = re.split("[a-z|A-Z|0-9]: ", "Delicious :): I want to eat this again") # Result: ['Delicious :)', 'I want to eat this again']

更新: 实际上,我的问题是从审阅文件中拆分。假设我有一个文件,每行都有这样的模式:[title]: [review]。我想获得标题和评论,但有些标题在冒号和空格前有一个特殊字符,我不想匹配它们。然而,我想匹配的冒号和空格前的字符显然是字母数字字符


Tags: to字符串re字母line数字result字符
2条回答

您可以使用带单个冒号的负号lookback进行拆分,或者使用字符类[:)],在该类中可以指定哪些字符不应直接出现在左侧

(?<!:):[ ]

部分地

  • (?<!:)负查找,断言左边的不是冒号
  • :[ ]匹配冒号后跟空格(仅为清晰起见添加方括号)

Regex demoPython demo

比如说

import re
pattern = r"(?<!:): "
line = re.split(pattern, "A: ") # Result: ['A', '']
print(line)
line = re.split(pattern, ":: )5: ") # Result: [':: )5', '']
print(line)
line = re.split(pattern, "Delicious :): I want to eat this again") # Result: ['Delicious :)', 'I want to eat this again']
print(line)

输出

['A', '']
[':: )5', '']
['Delicious :)', 'I want to eat this again']

解决方案

首先,正如您在示例中所示,您需要匹配除a-zA-Z0-9之外的字符,因此我们应该只使用.匹配器,它将匹配每个字符

所以我认为你想要的表达可能是:

(.*?):(?!.*:) (.*)

您可以这样使用它:

import re

pattern = r"(.*?):(?!.*:) (.*)"
matcher = re.compile(pattern)

txt1 = "A: "
txt2 = ":: )5: "
txt3 = "Delicious :): I want to eat this again"

result1 = matcher.search(txt1).groups() # ('A', '')
result2 = matcher.search(txt2).groups() # (':: )5', '')
result3 = matcher.search(txt3).groups() # ('Delicious :)', 'I want to eat this again')

解释

我们使用捕获组(括号)将字符串中的不同部分分成不同的组,search然后找到这些组并将它们输出到元组中

{}部分被称为“负前瞻”,我们使用它来确保从找到的最后一个{}开始捕获

编辑

顺便说一句,如果如您所提到的,您有许多行,每行都包含一篇评论,那么您可以使用此代码段一次将所有评论按标题和正文分开:

import re

pattern = r"(.*?):(?!.*:) (.*)\n?"
matcher = re.compile(pattern)

reviews = """ 
A: 
:: )5: 
Delicious :): I want to eat this again
"""

parsed_reviews = matcher.findall(reviews) # [('A', ''), (':: )5', ''), ('Delicious :)', 'I want to eat this again')]

相关问题 更多 >