设为首页收藏本站

Crossin的编程教室

 找回密码
 立即加入
查看: 20400|回复: 14
打印 上一主题 下一主题

使用正则表达式匹配单词

[复制链接]

7

主题

0

好友

127

积分

注册会员

Rank: 2

跳转到指定楼层
楼主
发表于 2016-10-30 10:15:34 |只看该作者 |倒序浏览
r'\b[a-zA-Z][a-zA-Z]+\b
结果不能匹配:.ing  the7876y're  这类
请问这是怎么回事?谢谢!
回复

使用道具 举报

174

主题

45

好友

12万

积分

管理员

Rank: 9Rank: 9Rank: 9

沙发
发表于 2016-10-30 17:18:15 |只看该作者
你这个规则就是匹配两个以上字母的单词,中间有数字是没法匹配的。符号也不会匹配进来
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

7

主题

0

好友

127

积分

注册会员

Rank: 2

板凳
发表于 2016-10-31 20:16:31 |只看该作者
crossin先生 发表于 2016-10-30 17:18
你这个规则就是匹配两个以上字母的单词,中间有数字是没法匹配的。符号也不会匹配进来 ...

我使用的是\b \b将字母包含在了其中啊,表示开头是字母,接着是一连串字母结尾
回复

使用道具 举报

174

主题

45

好友

12万

积分

管理员

Rank: 9Rank: 9Rank: 9

地板
发表于 2016-11-1 17:12:23 |只看该作者
Tony 发表于 2016-10-31 20:16
我使用的是\b \b将字母包含在了其中啊,表示开头是字母,接着是一连串字母结尾 ...
\b是正则表达式规定的一个特殊代码(好吧,某些人叫它元字符,metacharacter),代表着单词的开头或结尾,也就是单词的分界处。虽然通常英文的单词是由空格,标点符号或者换行来分隔的,但是\b并不匹配这些单词分隔字符中的任何一个,它只匹配一个位置。


你现在结果是 img re ,这个有问题吗?你没说清,你说的不能匹配是什么意思。
the和y因为旁边跟的是数字,是不符合的
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

7

主题

0

好友

127

积分

注册会员

Rank: 2

5#
发表于 2016-11-1 22:18:54 |只看该作者
crossin先生 发表于 2016-11-1 17:12
你现在结果是 img re ,这个有问题吗?你没说清,你说的不能匹配是什么意思。
the和y因为旁边跟的是数 ...

我想我明白先生的意思了,那么,请问,我应该怎样写,才能让其正确呢?
回复

使用道具 举报

174

主题

45

好友

12万

积分

管理员

Rank: 9Rank: 9Rank: 9

6#
发表于 2016-11-2 15:39:55 |只看该作者
Tony 发表于 2016-11-1 22:18
我想我明白先生的意思了,那么,请问,我应该怎样写,才能让其正确呢? ...

你要匹配出哪个?你好像还是没有说
你给个例子,什么样的文本,要从中匹配出哪些。你用了什么规则,结果匹配出什么
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

7

主题

0

好友

127

积分

注册会员

Rank: 2

7#
发表于 2016-11-2 19:00:53 |只看该作者
crossin先生 发表于 2016-11-2 15:39
你要匹配出哪个?你好像还是没有说
你给个例子,什么样的文本,要从中匹配出哪些。你用了什么规则,结果匹 ...

是一个 类似于这样的:
Ho454w m545any roads must a man walk downBef434ore they call him a man
H767ow m767any s767eas m676ust a wh453ite do4543ve sai45l
Be56fore s565he sle3434eps i343n th434e san453d
Ho343w man565y tim5767es m767ust t78he cann564on ba45lls f656ly
Be686fore the7876y're f787orever ba7878nned
T7567he an75675swer m76y fr656iend is blowing in the wind
The answer is blow .ing in the wi1n3d th345'are

现在,我需要用正则表达式找出其中所有的英文单词。
我使用表达式:r'\b[a-zA-Z][a-zA-Z]+\b
结果它将 .ing 'are  等也当成了英文单词。
请问,我需要怎样修改,才能正确,谢谢!
回复

使用道具 举报

174

主题

45

好友

12万

积分

管理员

Rank: 9Rank: 9Rank: 9

8#
发表于 2016-11-2 22:49:28 |只看该作者
Tony 发表于 2016-11-2 19:00
是一个 类似于这样的:
Ho454w m545any roads must a man walk downBef434ore they call him a man
H767o ...

符号分割是符合 \b 的定义的,就是单词的边界。
你想要的其实是两边是空格或开头结尾的纯单词,即使是标点分割也不算,是这样吧。

那我觉得比较复杂。我能想到的办法就是用零宽断言:
(?<=\s)[A-z]+(?=\s|$)
然后还要考虑上第一个单词的情况
^[A-z]+
所以并一起就是
(?<=\s)[A-z]+(?=\s|$)|^[A-z]+
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

7

主题

0

好友

127

积分

注册会员

Rank: 2

9#
发表于 2016-11-3 19:18:25 |只看该作者
crossin先生 发表于 2016-11-2 22:49
符号分割是符合 \b 的定义的,就是单词的边界。
你想要的其实是两边是空格或开头结尾的纯单词,即使是标 ...

对,我就想要的是这个。
可是,按照你写的正则表达式,结果还是不行啊。。。
回复

使用道具 举报

174

主题

45

好友

12万

积分

管理员

Rank: 9Rank: 9Rank: 9

10#
发表于 2016-11-4 14:18:30 |只看该作者
Tony 发表于 2016-11-3 19:18
对,我就想要的是这个。
可是,按照你写的正则表达式,结果还是不行啊。。。 ...
  1. import re
  2. r='(?<=\s)[A-z]+(?=\s|$)|^[A-z]+'
  3. s='''
  4. Ho454w m545any roads must a man walk downBef434ore they call him a man
  5. H767ow m767any s767eas m676ust a wh453ite do4543ve sai45l
  6. Be56fore s565he sle3434eps i343n th434e san453d
  7. Ho343w man565y tim5767es m767ust t78he cann564on ba45lls f656ly
  8. Be686fore the7876y're f787orever ba7878nned
  9. T7567he an75675swer m76y fr656iend is blowing in the wind
  10. The answer is blow .ing in the wi1n3d th345'are
  11. '''
  12. re.findall(r,s)
复制代码
输出
['roads', 'must', 'a', 'man', 'walk', 'they', 'call', 'him', 'a', 'man', 'a', 'is', 'blowing', 'in', 'the', 'wind', 'The', 'answer', 'is', 'blow', 'in', 'the']
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即加入

QQ|手机版|Archiver|Crossin的编程教室 ( 苏ICP备15063769号  

GMT+8, 2024-12-22 14:21 , Processed in 0.017798 second(s), 26 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部