鱼C论坛

 找回密码
 立即注册
查看: 2617|回复: 17

python 正则表达式

[复制链接]
发表于 2019-9-4 16:30:44 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
各位大佬,小弟写个re想匹配英文的月份(例如JAN,FEB),因为月份可以写成JAN,也可以写成January,所以写成了[^A-Z]JAN这种格式,前面加[^A-Z]是为了防止刚好有哪个单词里面包含JAN而导致匹配到了不需要的结果,但是这样写的话如果字符串是“JAN 5th”又匹配不到JAN了,所以想请教一下re应该怎么写。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-9-4 16:36:38 | 显示全部楼层
比如说re.findall("[^a-z]?JAN","JANUE JAN DS_JAN JJANUARY",flags=re.I)的结果是['JAN', ' JAN', '_JAN', 'JAN'],而我不想要最后面JJANUARY里的JAN,因为他前面包含了[A-Z]
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-9-4 16:41:47 From FishC Mobile | 显示全部楼层
吾乃段王爷 发表于 2019-9-4 16:36
比如说re.findall("[^a-z]?JAN","JANUE JAN DS_JAN JJANUARY",flags=re.I)的结果是['JAN', ' JAN', '_JAN', ...

你这需求不适合用正则
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-9-4 16:44:17 | 显示全部楼层
你要是找固定的那就r'JAN|January',而且正则一般是为了匹配别的内容,你就找月份感觉没什么用啊
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-9-4 16:49:27 | 显示全部楼层
塔利班 发表于 2019-9-4 16:44
你要是找固定的那就r'JAN|January',而且正则一般是为了匹配别的内容,你就找月份感觉没什么用啊

我需要判断内容里是否有月份信息,如果有再对其进行后面的判断,是1-12月的我都需要找,但是万一刚好有的单词或者别人书写不规范导致我匹配到了不需要的就不好了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-9-4 16:50:42 | 显示全部楼层
wp231957 发表于 2019-9-4 16:41
你这需求不适合用正则

我不只是要取月份,还需要月份左右的信息进行后续判断,但是目前的难题就是卡在月份匹配这里了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-9-4 16:53:58 | 显示全部楼层
塔利班 发表于 2019-9-4 16:44
你要是找固定的那就r'JAN|January',而且正则一般是为了匹配别的内容,你就找月份感觉没什么用啊

比如所4月5日,可能写成5th APRIL、5th APR、APRIL 5TH、APR 5TH,结果刚好内容里有个A PRICIPLE 5,但是由于书写不规范导致A和PRICIPLE连在一起了,这样也会把日期解析成4月5号,但是原文意思并不是表示日期
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-9-4 17:04:49 From FishC Mobile | 显示全部楼层
吾乃段王爷 发表于 2019-9-4 16:53
比如所4月5日,可能写成5th APRIL、5th APR、APRIL 5TH、APR 5TH,结果刚好内容里有个A PRICIPLE 5,但是 ...

最好提供样例
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-9-4 17:11:41 | 显示全部楼层
恩,你还是把所有可能性想好,再出一个泛化的模型
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-9-4 17:13:16 | 显示全部楼层
我大概了解你的意思了,下面这个可能有帮助

re.findall("[^a-zA-Z](JAN)", "JANUE JAN DS_JAN JJANUARY")

首先你不能加问号,那样相当于还是匹配了字母。

其次要把大小写都包含进去

当然你要是运行一下我写的,发现也不是完美,第一个JAN显示不了,需要再写一行代码查找一下字符串最开头有没有JAN
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-9-4 17:30:39 From FishC Mobile | 显示全部楼层
facevoid 发表于 2019-9-4 17:13
我大概了解你的意思了,下面这个可能有帮助

re.findall("[^a-zA-Z](JAN)", "JANUE JAN DS_JAN JJANUARY" ...

12个月呢,还有小写情况,共24种可能
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-9-4 18:29:36 | 显示全部楼层
wp231957 发表于 2019-9-4 17:30
12个月呢,还有小写情况,共24种可能

这个需求的话比较直接的是写24行。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-9-4 19:13:36 | 显示全部楼层
吾乃段王爷 发表于 2019-9-4 16:53
比如所4月5日,可能写成5th APRIL、5th APR、APRIL 5TH、APR 5TH,结果刚好内容里有个A PRICIPLE 5,但是 ...

书写不规范什么鬼……
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-9-4 20:51:08 | 显示全部楼层
举个例子?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-9-4 21:05:59 | 显示全部楼层
不是很懂楼主的意思。
要不试试前边加单词边界 r"\bJAN"吧
但是你说书写不规范的话,还是有可能匹配不到。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-9-4 21:27:25 | 显示全部楼层
25.png
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-9-10 13:50:21 | 显示全部楼层
经过试验,re应该写成([^a-z]jan|^jan)这样,满足我的要求,[^a-z]jan匹配所有jan前面不是字母的,然后^jan匹配开头就是jan的,因为[^a-z]jan匹配不到字符串是jan开头的,可能我在前面表述不是很准确,向各位抱歉!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-9-10 13:52:30 | 显示全部楼层
前面说的可能书写错误导致匹配错误啥的,当时没找到好的例子,后来找到一个,比如像Abidjan,这是一个港口名,如果只是用jan|january的话,这里就会直接匹配为一月了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-1-18 02:14

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表