在第一个子字符串后面有空格时,在Python中的两个子字符串之间查找字符串

时间:2018-03-31 19:00:32

标签: python regex substring string-search

虽然StackOverflow上有几个与此类似的帖子,但当目标字符串是其中一个子字符串之后的一个空格时,它们都不会出现这种情况。

我有以下字符串(example_string): <insert_randomletters>[?] I want this string.Reduced<insert_randomletters>

我想提取&#34;我想要这个字符串。&#34;从上面的字符串。随机数字将始终改变,但引用&#34;我想要这个字符串。&#34;将始终位于[?](最后一个方括号后面的空格)和缩小之间。

现在,我可以执行以下操作来提取&#34;我想要这个字符串&#34;。

target_quote_object = re.search('[?](.*?)Reduced', example_string)
target_quote_text = target_quote_object.group(1)
print(target_quote_text[2:])

这消除了始终出现在我提取的字符串开头的],因此只打印&#34;我想要这个字符串。&#34;但是,这个解决方案似乎很难看,我宁愿让re.search()返回当前目标字符串而不做任何修改。我怎么能这样做?

5 个答案:

答案 0 :(得分:4)

您的'[?](.*?)Reduced'模式与文字?匹配,然后捕获除换行符之外的任何0 +字符,尽可能少到第一个Reduced子字符串。 [?]是由非转义括号组成的字符类,字符类中的?是文字?字符。这就是为什么您的第1组包含]和空格。

要使正则表达式匹配[?],您需要转义[?,它们将作为文字字符进行匹配。此外,您需要在]之后添加一个空格,以确保它不会进入第1组。更好的想法是使用\s*(0个或更多个空格)或\s+( 1次或更多次)。

使用

re.search(r'\[\?]\s*(.*?)Reduced', example_string)

请参阅regex demo

import re
rx = r"\[\?]\s*(.*?)Reduced"
s = "<insert_randomletters>[?] I want this string.Reduced<insert_randomletters>"
m = re.search(r'\[\?]\s*(.*?)Reduced', s)
if m:
    print(m.group(1))
# => I want this string.

请参阅Python demo

答案 1 :(得分:1)

解决方案原来是:

target_quote_object = re.search('] (.*?)Reduced', example_string)
target_quote_text = target_quote_object.group(1)
print(target_quote_text)

然而,Wiktor的解决方案更好。

答案 2 :(得分:1)

如果您的字符串格式一致,

可能

<button>Click</button>

答案 3 :(得分:1)

你[co] / [笑]使用Positive Lookbehind (?<=\[\?\])

enter image description here

import re
pattern=r'(?<=\[\?\])(\s\w.+?)Reduced'

string_data='<insert_randomletters>[?] I want this string.Reduced<insert_randomletters>'

print(re.findall(pattern,string_data)[0].strip())

输出:

I want this string.

答案 4 :(得分:0)

与其他答案一样,这可能没有必要。或者只是过于冗长的Python。 此方法使用常见的字符串方法之一find

  • str.find(sub,start,end)将返回子字符串sub中第一次出现str[start:end]的索引,如果找不到,则返回 -1
  • 在每次迭代中,索引为[?]的索引为Reduced。打印出结果子字符串。
  • 每次返回此[?]...Reduced模式时,索引都会更新为字符串的其余部分。从该索引继续搜索。

代码

s = ' [?] Nice to meet you.Reduced  efweww  [?] Who are you? Reduced<insert_randomletters>[?] I want this 
string.Reduced<insert_randomletters>'


idx = s.find('[?]')
while idx is not -1:
    start = idx
    end = s.find('Reduced',idx)
    print(s[start+3:end].strip())
    idx = s.find('[?]',end)

输出

$ python splmat.py
Nice to meet you.
Who are you?
I want this string.