将子字符串的第一个实例与正则表达式匹配

时间:2019-09-06 00:14:14

标签: python regex

我正在尝试使用python的re模块将字符串中的所有内容匹配到多行注释的结尾。

我目前遇到的字符串是:

[ms]

我正在字符串上执行的搜索如下:

i = 333;        ******************/       */

我希望搜索功能能够匹配到tempLine = re.search(r'.*\*/(.*)', line, flags=0).group(1) 首次出现之前的任意数量的字符。

我想使用添加到re的组保存第一个*/之后的所有内容,并将其保存在变量tempLine中。

正则表达式匹配对象最终如下:

*/

该小组最终以:

<re.Match object; span=(0, 41), match='i = 333;     *****************/       */'>

意味着正则表达式将所有匹配到字符串末尾"" 的内容匹配,而不是匹配出现在星号之后的第一个*/

如何使重新匹配所有匹配项,直到第一次出现*/为止?

4 个答案:

答案 0 :(得分:1)

因为目标是固定的字符串,并且由于您正寻找第一个匹配项,所以您可以考虑使用非re函数,例如str.partition

这将更快,因为它不需要正则表达式处理的开销。

答案 1 :(得分:0)

此表达式

[^/]*/\s+(?=\*/)

使用re.searchre.matchre.findall可能也可以正常工作。

测试

import re

string = "i = 333;        ******************/       */"

print(re.search(r"[^/]*/\s+(?=\*/)", string, re.DOTALL).group(0))
print(re.match(r"[^/]*/\s+(?=\*/)", string, re.DOTALL).group(0))
print(re.findall(r"[^/]*/\s+(?=\*/)", string, re.DOTALL))

输出

i = 333;        ******************/       
i = 333;        ******************/       
['i = 333;        ******************/       ']

  

如果您想探索/简化/修改表达式,可以   在右上角的面板上进行了说明   regex101.com。如果您愿意,   也可以在this link中观看它的匹配方式   针对一些样本输入。


答案 2 :(得分:0)

您可以将re.search用于:

[^/*]+\*+/(.*)

说明

  • [^/*]+匹配除/*以外的任意字符1倍以上
  • \*+/匹配1次以上*,然后匹配/
  • (.*)捕获 group 1 匹配除换行符0次以上(或(.+) 1次以上)以外的任何字符

Regex demo | Python demo

例如

import re

regex = r"[^/*]+\*+/(.*)"
test_str = "i = 333;        ******************/       */python "
matches = re.search(regex, test_str)

if matches:
    tempLine = matches.group(1)
    print(tempLine)

结果

*/python

答案 3 :(得分:-1)

您可以使用此正则表达式(.*?)\*/

(.*?)将n个字符分成第1组,?将其设为非贪婪,这意味着当下一个规则为匹配项时,它将停止匹配。 \*/得到* /

line = 'i = 333;        ******************/       */'
tempLine = re.search(r'(.*?)\*/', line, flags=0).group(1)
print(tempLine) # i = 333;        *****************