【问题标题】:Regex starts and ends with CAPITAL word in a line, several lines amid CAPITAL single-line words正则表达式在一行中以大写单词开头和结尾,在大写单行单词中间有几行
【发布时间】:2019-07-19 05:33:44
【问题描述】:

我想知道以下情况的正则表达式:

字符串在一行中包含一个大写单词,前面有两个换行符。之后,有几行字母数字字母(可能是非 ASCII utf-8)或空行。我想捕获从一行中的大写单词开始并在下一个大写单词行之前结束的整个部分。单行大写单词可能有重复。

我探索和查找了很多但失败了。

例子

ASDF
wqer rtre 34 $^&% fsfa
DDwrgd 43 er 1. ewrtfg
324rfegf 4gfgre

PIIPUU
gre tt HKH rre345 
sdrfetre
ewrewrqwr werfewrt34vds

ret
gre
wretretertettre

PIIPUU
asdf reb dsfdsg
dsafdfbh rt3456 rge grefgreg
reretr erfret34 ef

retretretr

QWE
pritoy Fbhfg 45345 )*9
tret 345 gret54
retre 56 gre ger
retgrh 546ttre

MMNNBMB
aserew Sfjlkjf
gdf
rerettyrdfv re HFGHFFHF er
ergre ret retre 
ret retretret 

reg regrtgh rertgre tret

我想分离所有符合条件的部分,如下所示:

ASDF
wqer rtre 34 $^&% fsfa
DDwrgd 43 er 1. ewrtfg
324rfegf 4gfgre
PIIPUU
gre tt HKH rre345 
sdrfetre
ewrewrqwr werfewrt34vds

ret
gre
wretretertettre
PIIPUU
asdf reb dsfdsg
dsafdfbh rt3456 rge grefgreg
reretr erfret34 ef

retretretr
QWE
pritoy Fbhfg 45345 )*9
tret 345 gret54
retre 56 gre ger
retgrh 546ttre
MMNNBMB
aserew Sfjlkjf
gdf
rerettyrdfv re HFGHFFHF er
ergre ret retre 
ret retretret 

reg regrtgh rertgre tret

【问题讨论】:

  • 您是否尝试过使用regexr.com 是一种直观地测试和设计正则表达式的好方法?
  • 哇!我不知道这个,很棒的工具。非常感谢。

标签: python regex


【解决方案1】:

这个表达式很可能提取出我们想要的输出:

(?=^[A-Z]+$)([\s\S]*?)(?=^[A-Z]+$)|([\s\S]*)

表达式在this demo 的右上方面板中进行了解释,如果您想探索/简化/修改它。

测试

import re

regex = r"(?=^[A-Z]+$)([\s\S]*?)(?=^[A-Z]+$)|([\s\S]*)"

test_str = """

ASDF
wqer rtre 34 $^&% fsfa
DDwrgd 43 er 1. ewrtfg
324rfegf 4gfgre

QWE
pritoy Fbhfg 45345 )*9
tret 345 gret54
retre 56 gre ger
retgrh 546ttre

PIIPUU
gre tt HKH rre345 
sdrfetre
ewrewrqwr werfewrt34vds

ret
gre
wretretertettre

MMNNBMB
aserew Sfjlkjf
gdf
rerettyrdfv re HFGHFFHF er
ergre ret retre 
ret retretret 

reg regrtgh rertgre tret

"""

print(re.findall(regex, test_str, re.MULTILINE))

输出

[('', ''), ('ASDF\nwqer rtre 34 $^&% fsfa\nDDwrgd 43 er 1. ewrtfg\n324rfegf 4gfgre\n\n', ''), ('', ''), ('QWE\npritoy Fbhfg 45345 )*9\ntret 345 gret54\nretre 56 gre ger\nretgrh 546ttre\n\n', ''), ('', ''), ('PIIPUU\ngre tt HKH rre345 \nsdrfetre\newrewrqwr werfewrt34vds\n\nret\ngre\nwretretertettre\n\n', ''), ('', ''), ('', 'MMNNBMB\naserew Sfjlkjf\ngdf\nrerettyrdfv re HFGHFFHF er\nergre ret retre \nret retretret \n\nreg regrtgh rertgre tret'), ('', '')]

【讨论】:

  • Emma,Python 支持多行字符串语法。使用"""some multiline content here""" 而不是您现在使用的详细形式。
【解决方案2】:

这是使用re.findall的一种方法:

matches = re.findall(r'(?:^|\n\n)([A-Z]{3,}.*?)(?=\n\n[A-Z]{3,}\n|$)', input, flags=re.DOTALL)
print(matches)

打印出来:

['ASDF\nwqer rtre 34 $^&% fsfa\nDDwrgd 43 er 1. ewrtfg\n324rfegf 4gfgre',
 'QWE\npritoy Fbhfg 45345 )*9\ntret 345 gret54\nretre 56 gre ger\nretgrh 546ttre',
 'PIIPUU\ngre tt HKH rre345 \nsdrfetre\newrewrqwr werfewrt34vds\n\nret\ngre\nwretretertettre',
 'MMNNBMB\naserew Sfjlkjf\ngdf\nrerettyrdfv re HFGHFFHF er\nergre ret retre \nret retretret \n\nreg regrtgh rertgre tret']

这里是使用的正则表达式模式的解释:

(?:^|\n\n)      match either the start of the input or two consecutive newlines
([A-Z]{3,}.*?)  then match and capture three or more capital letters,
                followed by all content (including newlines) until seeing
(?=\n\n[A-Z]{3,}\n|$)  either two newlines and a capital term or the end of the input

【讨论】:

    【解决方案3】:

    试试这个:

    regex = re.compile(r"^[A-Z]+\r?\n(?:(?!^\r?\n[A-Z]+\r?\n).)*", re.MULTILINE|re.DOTALL)
    

    说明:

    ^                      # Start of line
    [A-Z]+                 # Match uppercase ASCII keyword
    \r?\n                  # Match newline
    (?:                    # Start of non-capturing group
     (?!^\r?\n[A-Z]+\r?\n) # Make sure we're not (yet) at the start of another keyword
     .                     # If so, match any character including newline
    )*                     # Repeat any number of times.
    

    测试它live on regex101.com

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-15
      • 2017-01-29
      • 2020-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多