首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python将模式与和和组组合在一起。

python将模式与和和组组合在一起。
EN

Stack Overflow用户
提问于 2019-02-20 04:10:20
回答 2查看 123关注 0票数 2

我试图使用regex来匹配满足以下条件的东西:

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

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

代码语言:javascript
复制
f = open("test.js", 'r')
lines = f.readlines()
for line in lines:
    matches = regex.findall(line)
    if matches:
        print(matches)

首先,我尝试使用以下模式来匹配汉字:

代码语言:javascript
复制
re.compile(r"[\u4e00-\u9fff]+")

它可以工作,并给我输出:

代码语言:javascript
复制
['下载失成功']
['下载失败']
['绑定监听']
['该功能暂未开放']

然后,我尝试用以下模式排除"//“,并将其与上面的模式结合起来:

代码语言:javascript
复制
re.compile(r"^(?=^(?:(?!//).)*$)(?=.*[\u4e00-\u9fff]+).*$")

它给了我输出:

代码语言:javascript
复制
['           showToastByText("该功能暂未开放");']

这几乎是对的,但我想要的只是汉字部分。

我试着添加"()“,但就是不能拿起我想要的部分。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-02-20 04:47:50

您不需要这么复杂的正则表达式,只需在输入中否定//并捕获出现在一起的汉字。如果放弃包含//的行

代码语言:javascript
复制
^(?!.*//)[^\u4e00-\u9fff]*([\u4e00-\u9fff]+)

可以从第一个分组模式中提取汉字。

对上述正则表达式的解释:

  • ^ -字符串的开始
  • (?!.*//) -如果//出现在前面的任何位置,那么向前看将放弃比赛。
  • [^\u4e00-\u9fff]* -可选地匹配零或多个非中文字符。
  • ([\u4e00-\u9fff]+) -捕获一个或多个汉字,然后放入第一个分组模式。

演示

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

代码语言:javascript
复制
import re

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

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

指纹,

代码语言:javascript
复制
该功能暂未开放

在线Python演示

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

由于要提取多个中文字符,可以检查字符串是否不包含//,然后使用findall提取所有中文文本。下面是一个演示相同的示例代码,

代码语言:javascript
复制
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))

指纹,

代码语言:javascript
复制
showToastByText("该功能暂未开放");  -->  ['该功能暂未开放']
//showToastByText("该功能暂未开放");  --> contains // hence not finding
showToastByText("未开放");  -->  ['未开放']
showToastByText("该功能暂xxxxxx未开放");  -->  ['该功能暂', '未开放']

在线Python演示

票数 0
EN

Stack Overflow用户

发布于 2019-02-20 04:21:36

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

因此,使用:

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

你的第一个捕获组将是汉字。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54778714

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档