从多字符子字符串的开始到第一次出现匹配一段文本

2024-04-25 12:22:50 发布

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

我希望正则表达式搜索在到达“”时结束,但当它到达“.”时就不会了;我知道使用[^...]来排除单个字符,并且在它到达某个字符时一直使用它来停止搜索。不过,这对字符串不起作用,因为[^. ]到达任一字符时就会停止。说我有密码

import re

def main():
    my_string = "The value of the float is 2.5. The int's value is 2.\n"
    re.search("[^.]*", my_string)

main()

它给出了一个匹配对象和字符串

"The value of the float is 2"

我怎样才能更改它,使它只在字符串“.”之后停止?你知道吗

另外一个问题,有没有办法告诉正则表达式在到达多个字符串中的一个时停止?以上面的代码为例,如果我希望搜索在找到字符串“”时结束或者字符串“\n”,我该怎么办?谢谢!你知道吗


Tags: ofthe字符串importre密码stringis
2条回答

除了Wiktor解释的经典方法外,在这种情况下,分裂也是一个有趣的解决方案。你知道吗

>>> my_string
"The value of the float is 2.5. The int's value is 2.\n"
>>> re.split('\. |\.\n', my_string)
['The value of the float is 2.5', "The int's value is 2", '']

如果你想在句末加句号,你可以这样做:

['{}.'.format(sentence) for sentence in re.split('\. |\.\n', my_string) if sentence]

要处理句子之间的多个空格:

>>> str2 = "The value of the float is 2.5.   The int's value is 2.\n\n  "
>>> ['{}.'.format(sentence) 
     for sentence in re.split('\. \s*|\.\n\s*', str2) 
     if sentence
     ]
['The value of the float is 2.5.', "The int's value is 2."]

要从字符串的开头到.后跟空格进行匹配,请使用

^(.*?)\.\s

如果只需要在点后面加空格或换行符,请使用其中一个(如果只有单个字符,则最好使用第二个;如果有多个字符,则使用交替)

^(.*?)\.(?: |\n)
^(.*?)\.[ \n]

参见regex demo。你知道吗

细节

  • ^-字符串的开头
  • (.*?)-捕获组1:除linebreak字符以外的任何0+字符,尽可能少
  • \.-文字.字符
  • \s-一个空白字符
  • (?: |\n)/[ \n]-匹配空格或(|)换行符的非捕获组。你知道吗

Python demo

import re

my_string = "The value of the float is 2.5. The int's value is 2.\n"
m = re.search("^(.*?)\.\s", my_string) # Try to find a match
if m:                                  # If there is a match
    print(m.group(1))                  # Show Group 1 value

注意如果输入中可能有换行符,则传递re.Sre.DOTALL标志:

m = re.search("^(.*?)\.\s", my_string, re.DOTALL)

相关问题 更多 >