regex 一种正则表达式模式,用于匹配从以s开头的单词开始到以s开头的单词之前的所有单词

wkyowqbh  于 2022-12-01  发布在  其他
关注(0)|答案(2)|浏览(188)

我试图捕获字符串中的单词,这样第一个单词以s开头,如果下一个单词也以s开头,正则表达式将停止匹配。
例如,我有一个字符串“Stack,Code and StackOverflow”。我只想捕获“Stack,Code and“,而不想在匹配中包含“StackOverflow”。
我是这样想的:
1.以空格开头,后跟s。
1.匹配除空格和s之外的所有字符(我使用的是负前瞻)。
我试过的正则表达式:

(?<=\s)S[a-z -,]*(?!(\sS))

我不知道该怎么做。

isr3a4wc

isr3a4wc1#

我认为这应该可以。我从this thread中改编了正则表达式。你也可以测试here。我还包括了一个非正则表达式的解决方案。我基本上跟踪了一个以“s”开头的单词的第一次出现,以及下一个以“s”开头的单词,并获得该范围内的单词。

import re

teststring = " Stack, Code and StackOverflow"
extractText = re.search(r"(\s)[sS][^*\s]*[^sS]*", teststring)

print(extractText[0])

#non-regex solution
listwords = teststring.split(' ')

# non regex solution
start = 0
end = 0
for i,word in enumerate(listwords):
    if word.startswith('s') or word.startswith('S'):
        if start == 0:
            start = i
        else:
            end = i
            break

newstring = " " + " ".join([word for word in listwords[start:end]])
print(newstring)
输出
Stack, Code and
 Stack, Code and
iszxjhcz

iszxjhcz2#

例如,可以使用捕获组:

(S(?<!\S.).*?)\s*S(?<!\S.)

说明

  • (捕获组1
  • S(?<!\S.)匹配S并AssertS的左侧没有空白边界
  • .*?匹配任意字符,尽可能少
  • )关闭”组
  • \s*匹配可选空格字符
  • S(?<!\S.)匹配S并AssertS的左侧没有空白边界

请参阅regex demoPython demo
示例代码:

import re

pattern = r"(S(?<!\S.).*?)\s*S(?<!\S.)"
s = "Stack, Code and StackOverflow"
m = re.search(pattern, s)
if m:
    print(m.group(1))

输出量

Stack, Code and

另一种选择是使用lookaround将SAssert到右侧,并且不使用它以允许多个匹配在彼此之后:

S(?<!\S.).*?(?=\s*S(?<!\S.))

Regex demo

import re

pattern = r"S(?<!\S.).*?(?=\s*S(?<!\S.))"
s = "Stack, Code and StackOverflow test Stack"
print(re.findall(pattern, s))

输出量

['Stack, Code and', 'StackOverflow test']

相关问题