用正则表达式提取子字符串

2024-10-04 05:30:59 发布

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

假设我有一个字符串:

L1045 +++$+++ u0 +++$+++ m0 +++$+++ BIANCA +++$+++ They do not!

我需要将名称-BIANCA和末尾的文本提取为两个变量。 我试着这样做:

dialogue = "L1045 +++$+++ u0 +++$+++ m0 +++$+++ BIANCA +++$+++ They do not!"
name : str = ""
line : str = ""
name = re.findall('^L.*\s(.+?)\s.*', dialogue)

但我对使用正则表达式有点困惑。 如何使用正则表达式解决这个问题

谢谢


Tags: 字符串name文本名称linenotdo末尾
3条回答

您可以在字符串的开头匹配L,并使用量词{n}设置匹配+++$+++的出现次数,后跟非空白字符

^L\S*(?: \+{3}\$\+{3} \S+){2} \+{3}\$\+{3} (\S+) \+{3}\$\+{3} (.+)$

模式匹配:

  • ^字符串的开头
  • L\S*MatchL后跟可选的非空白字符
  • (?: \+{3}\$\+{3} \S+){2}使用量词,重复2次匹配分隔符,后跟1+非空白字符
  • \+{3}\$\+{3}匹配分隔符
  • (\S+)捕获组1,匹配1+非空白字符以匹配BIANCA
  • \+{3}\$\+{3} 匹配分隔符
  • (.+)捕获第2组,匹配除新行之外的任何字符的1+倍They do not!
  • $字符串的结尾

Regex demo

你可以不用re就可以做到这一点

data = "L1045 +++$+++ u0 +++$+++ m0 +++$+++ BIANCA +++$+++ They do not!"
parts = data.split('+++$+++')
print(parts[-2].strip())
print(parts[-1].strip())

输出

BIANCA
They do not!

您可以使用此正则表达式:

[ \t]([^+]+)[ \t]\+{3}\$\+{3}[ \t]+([^+]+)$

Demo

Python:

import re

dialogue = "L1045 +++$+++ u0 +++$+++ m0 +++$+++ BIANCA +++$+++ They do not!"

>>> re.findall(r'[ \t]([^+]+)[ \t]\+{3}\$\+{3}[ \t]+([^+]+)$', dialogue)
[('BIANCA', 'They do not!')]

您还可以拆分和切片:

>>> re.split(r'[ \t]\+{3}\$\+{3}[ \t]', dialogue)[-2:]
['BIANCA', ' They do not!']

但是,如果没有找到+++$+++,分割和切片不会正常失败;上面的搜索模式确实如此

相关问题 更多 >