【问题标题】:Regular Expression To Extract Names提取名称的正则表达式
【发布时间】:2018-07-20 15:48:07
【问题描述】:

我有这种形式的字符串:

"""00.000000 00.000000; X-XX000-0000-0; France; Paris; Street 12a;   
00.000000 00.000000; X-XX000-0000-0; Spain; Barcelona; Street 123;"""

我想在字符串上方获取特定数据towns。我如何获得这些数据??

【问题讨论】:

  • 您能告诉我们更多关于字符串格式的信息吗?是分号分隔的字段numbers; numbers; country; city; street?你只想要城市吗?
  • 看起来就是这样,是的,基本上是分号分隔的字段。
  • 可以使用explode分号分隔符。
  • 这基本上是一个 CSV 文件...你甚至不需要正则表达式...

标签: regex algorithm regular-language


【解决方案1】:

如果您只想获取给定示例的城市,您可以使用positive lookahead

\b[^;]+(?=;[^;]+;$)

说明

\b # 字边界 [^;]+ # 不匹配 ;一次或多次 (?= # 断言以下内容的肯定前瞻是 ; # 匹配分号 [^;]+ # 不匹配 ;一次或多次 ; # 匹配 ; $ # 匹配字符串的结尾 ) # 关闭前瞻

【讨论】:

  • regex101.com/r/oJ9VHX/1 另外,从一开始就匹配,而不仅仅是城市。
  • @RobHannigan 我已经更新了我的答案,只选择了城市。
  • 我通常不会评论已接受的答案,但此表达式非常无效,请参阅 ^(?:[^;]+;){2}\s*([^;]+)(51 步)与 yours(1214 步)的比较。在这里,需要 20 倍 以上的步骤才能达到相同的结果。环视是“昂贵的”,在这种情况下真的不需要。在regex 世界中,一件非常重要的事情就是快结束(呃)。
  • @Jan 你是对的,在我之前的回答中,我使用了一种更有效的不同方法,但 OP 只希望选择城市。但我完全同意。
【解决方案2】:

假设Python(三个引号字符串):

string = """00.000000 00.000000; X-XX000-0000-0; France; Paris; Street 12a;   
00.000000 00.000000; X-XX000-0000-0; Spain; Barcelona; Street 123;"""

towns = [part[3] for line in string.split("\n") for part in [line.split("; ")]]
print(towns)

产量

['Paris', 'Barcelona']

真的不需要regex

【讨论】:

    【解决方案3】:

    如果您在第 4 个字段中有城市,则可以使用此模式匹配它:

     /(?:[^;]*;){3}([^;]*);/
    

    See the demo

    [^;]*; 你会发现一个由非分号组成并以分号结尾的字段

    (?:...){3}你找到它3次,但你没有捕获它

    ([^;]*); 然后你得到第 4 列匹配它的内容(不是分号)

    【讨论】:

    • regex101.com/r/84haeF/1 从一开始就匹配,而不仅仅是城市。
    • 字符串从开始是匹配,但它没有捕获所以只有城市会出现在正则表达式的操作结果中。
    猜你喜欢
    • 2015-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多