字符串1: Tyrsovo Nám., 252 63 布拉格, 捷克共和国
字符串2: Via Augusta 127, 8006 巴塞罗那, 西班牙
字符串3: Victoria Regina Square 11-12, 1210 布鲁塞尔 - Botanique, 比利时
希望得出各个字符串的城市名,比如字符串1是,布拉格,字符串2是, 巴塞罗那,字符串3是布鲁塞尔等等
![]() | 1 oott123 2015-06-16 18:45:04 +08:00 难道不是用逗号切开然后匹配中文就行了么…… |
![]() | 2 iyangyuan 2015-06-16 18:50:04 +08:00 via iPhone .*([\u2E80-\uFE4F]+).*,.*[\u2E80-\uFE4F]+.* 手机打的,没测,仅供参考 |
3 chopper 2015-06-16 18:54:18 +08:00 中文 233333,不知道ascii对应值,随便找了个 [\u4e00-\u9fa5]+(?=.*,) |
![]() | 4 funagi 2015-06-16 19:05:24 +08:00 ``` Python 2.7.6 (default, Mar 22 2014, 22:59:38) [GCC 4.8.2] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import re >>> s = u'''Tyrsovo Nám., 252 63 布拉格, 捷克共和国 ... Via Augusta 127, 8006 巴塞罗那, 西班牙 ... Victoria Regina Square 11-12, 1210 布鲁塞尔 - Botanique, 比利时''' >>> p = re.compile(u'([\u2E80-\u9FFF]+)') >>> for line in s.split('\n'): ... m = p.search(line) ... if m: ... print(m.group(1)) ... 布拉格 巴塞罗那 布鲁塞尔 >>> ``` |
5 lilydjwg 2015-06-16 19:14:35 +08:00 你们这些用正则的都不知道有个东西叫 \p{Han} 么。当然,PCRE 和 Python 的 regex 第三方库才支持。 |
![]() | 6 Biwood 2015-06-16 19:17:48 +08:00 第一部 /\d\s.*(?=,\s)/,去除数字+空格开头,,以逗号结尾的部分; 第二部[\u4e00-\u9fa5],取出中文; 应该有办法一步完成的,我再研究研究 |
![]() | 7 Biwood 2015-06-16 19:18:37 +08:00 打错字了,两步都是“取出” |
![]() | 9 picasso250 2015-06-16 19:53:45 +08:00 [^,]+,[\d ]+([^,]+) 解释: 匹配第一个逗号之前的内容. 匹配数字 匹配城市名 |
![]() | 10 Septembers 2015-06-16 20:27:23 +08:00 via Android 这是CSV格式啊 |
11 keepsome 2015-06-16 20:32:52 +08:00 适用于一行仅两段中文 [^\x{4e00}-\x{9fa5}]+([\x{4e00}-\x{9fa5}]+)[^\x{4e00}-\x{9fa5}]+[\x{4e00}-\x{9fa5}]+\s+ 全部替换成$1 最后一行加个换行或者手动提取就行 notepad++实测成功 |
![]() | 12 msg7086 2015-06-16 20:33:02 +08:00 @Septembers 并不是吧。 |
13 keepsome 2015-06-16 20:36:24 +08:00 [^\x{4e00}-\x{9fa5}]+([\x{4e00}-\x{9fa5}]+)[^\x{4e00}-\x{9fa5}]+[\x{4e00}-\x{9fa5}]+.*\s+ 修订版,为了防止后一段中文之后还有字符 其他一致,全部替换成$1 最后一行加个换行或者手动提取 |
15 ElvisZhu 2015-06-16 22:37:49 +08:00 ^[^,]+,[ 0-9]*([^0-9 ,]+).* 取\1 |
![]() | 16 leavic 2015-06-17 00:35:06 +08:00 先用逗号split一下吧,中文我还真不知道怎么搞,得查unicode代码 |
17 tntasdf 2015-06-17 09:08:18 +08:00 // PHP $str="Tyrsovo Nám., 252 63 布拉格, 捷克共和国 Via Augusta 127, 8006 巴塞罗那, 西班牙 Victoria Regina Square 11-12, 1210 布鲁塞尔 - Botanique, 比利时"; preg_match_all('/([^\x00-\x80]+?)(,|\s-)/',$str,$mts); // 更不规则的,改括号2的正则 print_r($mts); // $mts[1] 就是了 事实上不需要拘泥于一个正则搞定,可以先做字符串处理。正则规则写得越复杂,效率越慢。 |
18 tntasdf 2015-06-17 09:25:26 +08:00 写的是php , python不懂多少 。 主要看正则,大致是可以移植的。PHP中需要[^\x00-\x80]来匹配中文,python的话应该是其他, 另外就是非贪婪模式了。 |
![]() | 19 dallaslu 2015-06-17 09:28:42 +08:00 ,[\d\s]+(.*?)[,\s] |
![]() | 20 dallaslu 2015-06-17 09:29:43 +08:00 |
![]() | 21 tsingyi 2015-06-17 09:48:57 +08:00 如果只是取出第一个中文字符串的话可以用正则表达式的断言: (?!=[\u4E00-\u9FBF]+)[\u4E00-\u9FBF]+(?=\s|,) (?!=[\u4E00-\u9FBF]+) 确保之前没有中文字符 (?=\s|,)确保字符后为逗号或空格 |
![]() | 22 asj 2015-06-17 10:09:14 +08:00 用excel打开,复制列 |
23 ToughGuy 2015-06-17 15:30:44 +08:00 import re s = 'xxxxxx' re.findall(r'\d+ ([^\d ,]+)[, ]', s) |
![]() | 24 wuhx 2015-06-18 00:27:18 +08:00 上一个scala的版本 val str = """字符串1: Tyrsovo Nám., 252 63 布拉格, 捷克共和国 字符串2: Via Augusta 127, 8006 巴塞罗那, 西班牙 字符串3: Victoria Regina Square 11-12, 1210 布鲁塞尔 - Botanique, 比利时""" val pat = """(\p{IsHan}+)""".r for(lines <- str.split("\n")) { val m = pat.findAllMatchIn(lines) println(m.drop(1).next()) } |