我试图使用regex来匹配满足以下条件的东西:
我从一个文件中逐行读取:
f = open("test.js", 'r')
lines = f.readlines()
for line in lines:
matches = regex.findall(line)
if matches:
print(matches)首先,我尝试使用以下模式来匹配汉字:
re.compile(r"[\u4e00-\u9fff]+")它可以工作,并给我输出:
['下载失成功']
['下载失败']
['绑定监听']
['该功能暂未开放']然后,我尝试用以下模式排除"//“,并将其与上面的模式结合起来:
re.compile(r"^(?=^(?:(?!//).)*$)(?=.*[\u4e00-\u9fff]+).*$")它给了我输出:
[' showToastByText("该功能暂未开放");']这几乎是对的,但我想要的只是汉字部分。
我试着添加"()“,但就是不能拿起我想要的部分。
如有任何建议,将不胜感激:)
发布于 2019-02-20 04:47:50
您不需要这么复杂的正则表达式,只需在输入中否定//并捕获出现在一起的汉字。如果放弃包含//的行
^(?!.*//)[^\u4e00-\u9fff]*([\u4e00-\u9fff]+)可以从第一个分组模式中提取汉字。
对上述正则表达式的解释:
^ -字符串的开始(?!.*//) -如果//出现在前面的任何位置,那么向前看将放弃比赛。[^\u4e00-\u9fff]* -可选地匹配零或多个非中文字符。([\u4e00-\u9fff]+) -捕获一个或多个汉字,然后放入第一个分组模式。编辑:下面是示例代码,演示如何从group1捕获文本
import re
s = ' showToastByText("该功能暂未开放");'
m = re.search(r'^(?!.*//)[^\u4e00-\u9fff]*([\u4e00-\u9fff]+)',s)
if (m):
print(m.group(1))指纹,
该功能暂未开放编辑:用于提取注释中提到的多次出现的汉字
由于要提取多个中文字符,可以检查字符串是否不包含//,然后使用findall提取所有中文文本。下面是一个演示相同的示例代码,
import re
arr = ['showToastByText("该功能暂未开放");','//showToastByText("该功能暂未开放");','showToastByText("未开放");','showToastByText("该功能暂xxxxxx未开放");']
for s in arr:
if (re.match(r'\/\/', s)):
print(s, ' --> contains // hence not finding')
else:
print(s, ' --> ', re.findall(r'[\u4e00-\u9fff]+',s))指纹,
showToastByText("该功能暂未开放"); --> ['该功能暂未开放']
//showToastByText("该功能暂未开放"); --> contains // hence not finding
showToastByText("未开放"); --> ['未开放']
showToastByText("该功能暂xxxxxx未开放"); --> ['该功能暂', '未开放']发布于 2019-02-20 04:21:36
你不需要一个积极的展望,以获得汉字(因为它将不匹配任何东西)。因此,我们可以重写该部分,以便对.*进行延迟匹配,直到找到所需的字符为止。
因此,使用:
^(?=^(?:(?!//).)*$).*?([\u4e00-\u9fff]+).*$
你的第一个捕获组将是汉字。
https://stackoverflow.com/questions/54778714
复制相似问题