这个正则怎么写啊?

2020-10-31 13:21:34 +08:00
 llsquaer

用的 python

假设有一段文字

aaa.bbb.ccc.xxx(ddd.fffssss.eeee)

所有字符都是不等长的单词..需要做的是.提取出如下格式内容

xxx(ddd.fffssss.eeee)

提取出 . 号到 ( 号 和 ()号内 的文字..

这样的正则怎么写啊????

2926 次点击
所在节点    Python
9 条回复
gwy15
2020-10-31 13:25:39 +08:00
\.(\w+\(.+\))
Fechin
2020-10-31 13:28:59 +08:00
(?<=\.)[^\.]+\([^)]+\)
llsquaer
2020-10-31 14:08:47 +08:00
@gwy15 十分感谢啊. 为什么把 \w+ 改为 .+ 就变成了从开始位置的 . 开始了呢? 之前一直用 . 代表任意字符....所以之前一直没匹配上..
natsukage
2020-10-31 14:58:07 +08:00
@llsquaer #3 因为正则表达式引擎在匹配字符串和表达式时,是从前向后逐个扫描字符串中的字符,并判断是否与表达式符合的。 .bbb.ccc.xxx 和 .xxx 虽然都可以匹配 .+,但是正则表达式扫描的时候,从 .bbb 就已经开始能够正常匹配,一直持续到后面的整个 .bbb.ccc.xxx(ddd.fffssss.eeee) 结束匹配完成。虽然.ccc.xxx(ddd.fffssss.eeee)和.xxx(ddd.fffssss.eeee)也能完成匹配,但是因为.bbb.ccc.xxx(ddd.fffssss.eeee)是先来的,所以正则表达式会娶先来的这个作为最终结果。
如果想要解决这个问题,要么就是想办法让.bbb.ccc.xxx 和.ccc.xxx 不满足匹配,1 楼的解法就是这么做的,通过 \w 取代 . ,这样.xxx 就是第一个满足匹配的前缀了,因此能够正常匹配到你想要的结果。
要么就是提前把前面的部分( aaa.bbb.ccc.)全部用非捕获组匹配掉,然后在剩下的部分里匹配你想要匹配的内容,例如(?:.+\.)(?<match>.+?\([^)]+\))
dorothyREN
2020-10-31 19:04:29 +08:00
grep -o "[a-zA-Z]*(.*)"
dorothyREN
2020-10-31 19:04:56 +08:00
```
[root@db ~]# grep -o "[a-zA-Z]*(.*)" a
xxx(ddd.fffssss.eeee)
[root@db ~]#
```
dorothyREN
2020-10-31 19:32:23 +08:00
re.search(r"\.[^.]*\(.*\)", a)
huyangabc
2020-10-31 20:36:16 +08:00
\.(\w+\(.*\))
llsquaer
2020-11-02 11:11:36 +08:00
@natsukage
@dorothyREN
谢谢你们俩的解答...通过测试,终于算是搞明白了.

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/720448

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX