python正则表达式将模式与AND和group结合起来

2024-10-02 00:33:32 发布

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

我正在尝试使用regex来匹配满足以下条件的内容:

  1. 不包含“/”字符串
  2. 包含汉字
  3. 把那些汉字捡起来

我从一个文件中逐行阅读:

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("该功能暂未开放");']

这几乎是正确的,但我想要的只是汉字部分。你知道吗

我试着加上“()”,但就是找不到我想要的部分。你知道吗

如有任何建议,我们将不胜感激,谢谢:)


Tags: 文件字符串功能re内容line模式open
2条回答

你不需要一个积极的展望来获得汉字(因为它不会匹配任何东西)。因此,我们可以重写该部分,使之与.*进行延迟匹配,直到找到所需的字符。你知道吗

因此,使用:

^(?=^(?:(?!//).)*$).*?([\u4e00-\u9fff]+).*$

你的第一个抓捕组将是汉字

你不需要这么复杂的正则表达式来否定输入中的//并捕获按顺序出现的汉字。对于丢弃包含//的行来说,这个(?!.*//)负向前看就足够了,对于捕获中文文本来说,您可以使用这个regex [^\u4e00-\u9fff]*([\u4e00-\u9fff]+)来捕获,您的整个regex变成这样

^(?!.*//)[^\u4e00-\u9fff]*([\u4e00-\u9fff]+)

您可以从第一个分组模式中提取汉字。你知道吗

以上正则表达式的解释:

  • ^-字符串开头
  • (?!.*//)-如果//出现在前面任何一行中,则将丢弃匹配项的负向前看
  • [^\u4e00-\u9fff]*-可选地匹配零个或多个非中文字符
  • ([\u4e00-\u9fff]+)-捕获一个或多个汉字,然后放入第一个分组模式。你知道吗

Demo

编辑:下面是示例代码,显示如何从group1捕获文本

import re

s = '           showToastByText("该功能暂未开放");'

m = re.search(r'^(?!.*//)[^\u4e00-\u9fff]*([\u4e00-\u9fff]+)',s)
if (m):
 print(m.group(1))

指纹

该功能暂未开放

Online Python Demo

编辑:用于提取注释中提到的多次出现的汉字

由于要提取多次出现的汉字,可以检查字符串是否不包含//,然后使用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未开放");   >  ['该功能暂', '未开放']

Online Python demo

相关问题 更多 >

    热门问题