Coder Social home page Coder Social logo

bee-san / pywhat Goto Github PK

View Code? Open in Web Editor NEW
6.4K 71.0 340.0 6.09 MB

๐Ÿธ Identify anything. pyWhat easily lets you identify emails, IP addresses, and more. Feed it a .pcap file or some text and it'll tell you what it is! ๐Ÿง™โ€โ™€๏ธ

License: MIT License

Python 99.70% Dockerfile 0.30%
cyber security hacking cybersecurity malware re python pcap malware-analysis malware-research

pywhat's Introduction

โžก๏ธ Discord โฌ…๏ธ
The easiest way to identify anything
pip3 install pywhat && pywhat --help

Discord PyPI - Downloads Twitter Follow PyPI - Python Version PyPI


๐Ÿค” What is this?

Imagine this: You come across some mysterious text ๐Ÿง™โ€โ™‚๏ธ 0x52908400098527886E0F7030069857D2E4169EE7 or dQw4w9WgXcQ and you wonder what it is. What do you do?

Well, with what all you have to do is ask what "0x52908400098527886E0F7030069857D2E4169EE7" and what will tell you!

what's job is to identify what something is. Whether it be a file or text! Or even the hex of a file! What about text within files? We have that too! what is recursive, it will identify everything in text and more!

Installation

๐Ÿ”จ Using pip

$ pip3 install pywhat

or

# installs optional dependencies that may improve the speed
$ pip3 install pywhat[optimize] 

๐Ÿ”จ On Mac?

$ brew install pywhat

Or for our MacPorts fans:

$ sudo port install pywhat

โš™ Use Cases

๐Ÿฆ  Wannacry

You come across a new piece of malware called WantToCry. You think back to Wannacry and remember it was stopped because a researcher found a kill-switch in the code.

When a domain, hardcoded into Wannacry, was registered the virus would stop.

You use What to identify all the domains in the malware, and use a domain registrar API to register all the domains.

๐Ÿฆˆ Faster Analysis of Pcap files

Say you have a .pcap file from a network attack. What can identify this and quickly find you:

  • All URLs
  • Emails
  • Phone numbers
  • Credit card numbers
  • Cryptocurrency addresses
  • Social Security Numbers
  • and much more.

With what, you can identify the important things in the pcap in seconds, not minutes.

๐Ÿž Bug Bounties

You can use PyWhat to scan for things that'll make you money via bug bounties like:

  • API Keys
  • Webhooks
  • Credentials
  • and more

Run PyWhat with:

pywhat --include "Bug Bounty" TEXT

To do this.

Here are some examples ๐Ÿ‘‡

๐Ÿ™ GitHub Repository API Key Leaks

  1. Download all GitHub repositories of an organisation
  2. Search for anything that you can submit as a bounty, like API keys
# Download all repositories
GHUSER=CHANGEME; curl "https://api.github.com/users/$GHUSER/repos?per_page=1000" | grep -o 'git@[^"]*' | xargs -L1 git clone

# Will print when it finds things.
# Loops over all files in current directory.
find . -type f -execdir pywhat --include 'Bug Bounty' {} \;

๐Ÿ•ท Scan all web pages for bounties

# Recursively download all web pages of a site
wget -r -np -k https://skerritt.blog

# Will print when it finds things.
# Loops over all files in current directory.
find . -type f -execdir pywhat --include 'Bug Bounty' {} \;

PS: We support more filters than just bug bounties! Run pywhat --tags

๐ŸŒŒ Other Features

Anytime you have a file and you want to find structured data in it that's useful, What is for you.

Or if you come across some piece of text and you don't know what it is, What will tell you.

๐Ÿ“ File & Directory Handling

File Opening You can pass in a file path by what 'this/is/a/file/path'. What is smart enough to figure out it's a file!

What about a whole directory? What can handle that too! It will recursively search for files and output everything you need!

๐Ÿ” Filtering your output

Sometimes, you only care about seeing things which are related to AWS. Or bug bounties, or cryptocurrencies!

You can filter output by using what --rarity 0.2:0.8 --include Identifiers,URL https://skerritt.blog. Use what --help to get more information.

To see all filters, run pywhat --tags! You can also combine them, for example to see all cryptocurrency wallets minus Ripple you can do:

pywhat --include "Cryptocurrency Wallet" --exclude "Ripple Wallet" 1KFHE7w8BhaENAswwryaoccDb6qcT6DbYY

๐Ÿ‘ฝ Sorting, Exporting, and more!

Sorting You can sort the output by using what -k rarity --reverse TEXT. Use what --help to get more information.

Exporting You can export to json using what --json and results can be sent directly to a file using what --json > file.json.

Boundaryless mode What has a special mode to match identifiable information within strings. By default, it is enabled in CLI but disabled in API. Use what --help or refer to API Documentation for more information.

๐Ÿ• API

PyWhat has an API! Click here https://github.com/bee-san/pyWhat/wiki/API to read about it.

๐Ÿ‘พ Contributing

what not only thrives on contributors, but can't exist without them! If you want to add a new regex to check for things, you can read our documentation here

We ask contributors to join the Discord for quicker discussions, but it's not needed: Discord

๐Ÿ™ Thanks

We would like to thank Dora for their work on a bug bounty specific regex database which we have used.

pywhat's People

Contributors

0xmostafam avatar alb avatar alfredtso avatar alireza-sampour avatar amadejpapez avatar baldoarturo avatar bee-san avatar belialboy avatar chrisbergeron avatar colinodell avatar granitosaurus avatar gruebel avatar gvirtu avatar hexiro avatar holmanb avatar illuminatifish avatar imgbotapp avatar jyooru avatar logocomune avatar mavnt avatar mimiflynn avatar nodtem66 avatar p403n1x87 avatar pablolec avatar piatrashkakanstantinass avatar rackreaver avatar skeletaldemise avatar sonniki avatar spicyyboi avatar vanjo9800 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

pywhat's Issues

Not working README example

As README says:

Imagine this: You come across some mysterious text ๐Ÿง™โ€โ™‚๏ธ 5f4dcc3b5aa765d61d8327deb882cf99 and you wonder what it is. What do you do?
Well, with what all you have to do is ask what "5f4dcc3b5aa765d61d8327deb882cf99" and what will tell you!

But 'what' does not tell me! It does not find anything.
Therefore, 5f4dcc3b5aa765d61d8327deb882cf99 should be replaced with something else.

orjson accidentally required?

Describe the bug

#127 added an optional dependency on orjson:

orjson = {version = "^3.6.1", optional = true}

However, unless I'm missing something, this doesn't become truly optional for an end-user without adding an extra like:

[tool.poetry.extras]
orjson = ["orjson"]

To Reproduce

$ python3 -m venv venv
$ . .venv/bin/activate
$ pip install pywhat==3.4.0
$ pip freeze
click==7.1.2
colorama==0.4.4
commonmark==0.9.1
orjson==3.6.3
Pygments==2.10.0
pywhat==3.4.0
rich==10.7.0
$ curl -s https://pypi.org/pypi/pywhat/3.4.0/json | jq .info.requires_dist
[
  "click (>=7.1.2,<8.0.0)",
  "rich (>=9.9,<11.0)",
  "orjson (>=3.6.1,<4.0.0)"
]

Expected behavior

orjson to be an optional dep, only installed on request like pip install pywhat[orjson]

Fix bug where opening JSON file breaks things

C:\Users\xxx>ciphey -t "aGVsbG8gbXkgbmFtZSBpcyBiZWU="
Traceback (most recent call last):
File "d:\python\python37\lib\runpy.py", line 193, in _run_module_as_main
"main", mod_spec)
File "d:\python\python37\lib\runpy.py", line 85, in run_code
exec(code, run_globals)
File "D:\Python\Python37\Scripts\ciphey.exe_main.py", line 7, in
File "d:\python\python37\lib\site-packages\click\core.py", line 829, in call
return self.main(*args, **kwargs)
File "d:\python\python37\lib\site-packages\click\core.py", line 782, in main
rv = self.invoke(ctx)
File "d:\python\python37\lib\site-packages\click\core.py", line 1066, in invoke
return ctx.invoke(self.callback, **ctx.params)
File "d:\python\python37\lib\site-packages\click\core.py", line 610, in invoke
return callback(*args, **kwargs)
File "d:\python\python37\lib\site-packages\ciphey\ciphey.py", line 222, in main
config.complete_config()
File "d:\python\python37\lib\site-packages\ciphey\iface_config.py", line 189, in complete_config
self.load_objs()
File "d:\python\python37\lib\site-packages\ciphey\iface_config.py", line 132, in load_objs
_fwd.registry.get_named(self.checker, PolymorphicChecker)
File "d:\python\python37\lib\site-packages\ciphey\iface_config.py", line 102, in call
return self.instantiate(t)
File "d:\python\python37\lib\site-packages\ciphey\iface_config.py", line 97, in instantiate
ret = t(self)
File "d:\python\python37\lib\site-packages\ciphey\iface_modules.py", line 153, in init
self._base = cls(config)
File "d:\python\python37\lib\site-packages\ciphey\basemods\Checkers\ezcheck.py", line 46, in init
self.checkers.append(config(What))
File "d:\python\python37\lib\site-packages\ciphey\iface_config.py", line 102, in call
return self.instantiate(t)
File "d:\python\python37\lib\site-packages\ciphey\iface_config.py", line 97, in instantiate
ret = t(self)
File "d:\python\python37\lib\site-packages\ciphey\iface_modules.py", line 153, in init
self.base = cls(config)
File "d:\python\python37\lib\site-packages\ciphey\basemods\Checkers\what.py", line 59, in init
self.id = identifier.Identifier()
File "d:\python\python37\lib\site-packages\pywhat\identifier.py", line 10, in init
self.regex_id = RegexIdentifier()
File "d:\python\python37\lib\site-packages\pywhat\regex_identifier.py", line 11, in init
self.regexes = json.load(myfile)
File "d:\python\python37\lib\json_init.py", line 293, in load
return loads(fp.read(),
UnicodeDecodeError: 'gbk' codec can't decode byte 0xbf in position 695: illegal multibyte sequence

Exception when using --json with email input

Input:
pywhat [email protected] --json

Output:

Traceback (most recent call last):
  File "/Library/Frameworks/Python.framework/Versions/3.9/bin/pywhat", line 8, in <module>
    sys.exit(main())
  File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/click/core.py", line 829, in __call__
    return self.main(*args, **kwargs)
  File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/click/core.py", line 782, in main
    rv = self.invoke(ctx)
  File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/click/core.py", line 1066, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/click/core.py", line 610, in invoke
    return callback(*args, **kwargs)
  File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/pywhat/what.py", line 208, in main
    p.print_json(identified_output)
  File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/pywhat/printer.py", line 82, in print_json
    self.console.print(json.dumps(text))
  File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/rich/console.py", line 1555, in print
    renderables = self._collect_renderables(
  File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/rich/console.py", line 1420, in _collect_renderables
    self.render_str(
  File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/rich/console.py", line 1311, in render_str
    rich_text = render_markup(text, style=style, emoji=emoji_enabled)
  File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/rich/markup.py", line 148, in render
    raise MarkupError(
rich.errors.MarkupError: closing tag '[/?#]' at position 10409 doesn't match any open tag

Phone number support

It would be great if what could identify the string as a phone number and provide information about it like country code, etc.

Get the Python API to return the links to websites

When PyWhat is given longitude / latitude, it adds a Google Maps link to this.

It does this in the printing module. We should also return this in the Python API, so we'll need to turn this function into one used by both printing & API.

Identify PGP keys?

Not sure if this would be an appropriate functionality for this project. It doesn't seem to currently be supported, when I try running pywhat against a file containing a PGP public key, it says nothing found.

if this would be appropriate, I'd be happy to put up a PR implementing it :)

Identify Mac addresses

Currently a few different network address types are supported, but MAC and other 48-bit addresses are not.

Using a folder path as input

  • What is a great tool for identifying anything, but it also supports file input such as .pcap
  • Sometimes, we have loads of of files we want to scan for but it will take a long time to manually input each file into what

This is where the "folder" input comes in, give it a folder path and for each file / folder in there it will identify it

Add support for non-regex processing

Currently, pywhat only uses regular expressions to identify stuff. However, we may often want to update the description based on a match or to filter out false positives.

Some examples:

  • Pinging URLs to check if it is responding or if a certain resource exists, etc.
  • Parsing timestamps (#234) (1637093119.558717 to November 16, 2021 8:05:19 PM)
  • Changing rarity based on a match
  • And many more

How it should be implemented?

I think the best idea would be to write a class for every regex pattern (so that it can save the state between several matches). That class should have a method like process() that gets a match object and can alter it and return it or return None to filter it out.

Example:

class URLProcessor:
    def process(match):
        if "http://trashurl.it" in match["url"]: # Or maybe we should create an actual Match class and do match.url
            return None

Look at making regex "search within strings" by not having boundaries

Currently regex have boundaries which mean they only match if the text matches exactly.

I suggest we implement a mode for changing these boundaries and allowing people to use find_all(regex) to find "regex within strings".

Example:

abc192.168.0.1xzy

Does not work because the IP address regex has boundaries, whereas:

192.168.0.1

does work.

I'd also suggest implementing this with filtering, so we can disable the boundaries on regex that match a filter, for example:

All regex with rarity over 0.6 will have no boundaries

Because the boundaries are hard-coded in, like:

"^[13][a-km-zA-HJ-NP-Z1-9]{25,34}$",

I'm not sure on the best method to go around doing this? Ideally we have a conditional to remove the boundaries or not. Perhaps we want something like:

{
"Name": "Bitcoin (โ‚ฟ) Wallet Address",       
"Regex": "^[13][a-km-zA-HJ-NP-Z1-9]{25,34}$",
"Regex_Without_Boundary": "[13][a-km-zA-HJ-NP-Z1-9]{25,34}"
}

Suggestions are welcome, I'm not 100% sure on the best way :-)

Strange behaviour of README badges

Clicking on a badge does not open a specific website. Instead, it opens a page that only contains the badge I have clicked on. Only the Twitter badge works; however, it still opens the page with that badge only.

2 regex don't work

If there is 2 matching regex it will only return the first one.

#! python3

print("hello)

thm{"Can you guess what this is, now?"}

0x52908400098527886E0F7030069857D2E4169EE7

Fails.

Create "regex within regex" for subcategories

Some regex have sub-categories, for example:

  • Mastercard numbers -- the first 4 digits represent what company that card belongs to.
  • Phone numbers. If they start with +44 or 07, it's the UK!

As such, I propose we change our code into:

    {
       "Name": "MasterCard Number",
       "Regex": "^(?:5[1-5][0-9]{2}|222[1-9]|22[3-9][0-9]|2[3-6][0-9]{2}|27[01][0-9]|2720)[0-9]{12}$",
       "plural_name": false,
       "Description": null,
       "Rarity": 0.5,
       "Tags": [
          "Credit Card",
          "Finance"
       ],
        "Children": [
            {
                "Name": "BarclayCard",
                "Regex:" "5117.*"
                Same value as the parent above
            }
        ]
    },

We want to keep the same object for each child in case we have anything special to add like a website or a cool description etc. It doesn't cost us much to do this, but it is helpful!

Also, our regex for the children can be much broader. Read it as:

  1. When I pass the mastercard regex
  2. When I pass the barclaycard regex (which just checks to see if the first few numbers are equal to 5117)
  3. Return
    Because the children only run when the parents do, the child regex can be lighter.

As an aside, Mastercard have very helpfully provided a CSV table of all the companies and what their Mastercard subrange is:
https://www.mastercard.us/en-us/business/issuers/get-support/simplified-bin-account-range-table.html

More regex

	HTTPusername = re.search(b'log|login|wpname|ahd_username|unickname|nickname|user|user_name|alias|pseudo|email|username|_username|userid|form_loginname|loginname|login_id|loginid|session_key|sessionkey|pop_login|uid|id|user_id|screename|uname|ulogin|acctname|account|member|mailaddress|membername|login_username|login_email|loginusername|loginemail|uin|sign-in|j_username', decoded['data'])
	if HTTPusername:
		user = re.findall(b'(%s=[^&]+)' % HTTPusername.group(0), decoded['data'], re.IGNORECASE)
		if user:
			HTTPUser = user
	HTTPPasswd = re.search(b'ahd_password|pass|password|_password|passwd|session_password|sessionpassword|login_password|loginpassword|form_pw|pw|userpassword|pwd|upassword|login_passwordpasswort|passwrd|wppassword|upasswd|j_password', decoded['data'])
	if HTTPPasswd:
		passw = re.findall(b'(%s=[^&]+)' % HTTPPasswd.group(0), decoded['data'], re.IGNORECASE)
		if passw:
			HTTPass = passw
	SMTPAuth = re.search(b'AUTH LOGIN|AUTH PLAIN', decoded['data'])
	Basic64 = re.findall(b'(?<=Authorization: Basic )[^\n]*', decoded['data'])
	FTPUser = re.findall(b'(?<=USER )[^\r]*', decoded['data'])
	FTPPass = re.findall(b'(?<=PASS )[^\r]*', decoded['data'])
	HTTPNTLM2 = re.findall(b'(?<=WWW-Authenticate: NTLM )[^\\r]*', decoded['data'])
	HTTPNTLM3 = re.findall(b'(?<=Authorization: NTLM )[^\\r]*', decoded['data'])
	NTLMSSP1 = re.findall(b'NTLMSSP\x00\x01\x00\x00\x00.*[^EOF]*', decoded['data'])
	NTLMSSP2 = re.findall(b'NTLMSSP\x00\x02\x00\x00\x00.*[^EOF]*', decoded['data'],re.DOTALL)
	NTLMSSP3 = re.findall(b'NTLMSSP\x00\x03\x00\x00\x00.*[^EOF]*', decoded['data'],re.DOTALL)
	CTX1_USR = re.findall(b'<UserName>(.*?)</UserName><Password encoding="ctx1">', decoded['data'])
	CTX1_PWD = re.findall(b'<Password encoding="ctx1">(.*?)</Password>', decoded['data'])

	if CTX1_USR and CTX1_PWD:
		HeadMessage = Print_Packet_Details(decoded,SrcPort,DstPort)
		try:
			CTX1_USR = CTX1_USR[0]
			CTX1_PWD = ParseCTX1Hash(CTX1_PWD[0])
			CTX1_CREDS = CTX1_USR + ':' + CTX1_PWD
			Message = 'Found CTX1 encoded password: %s\n'%CTX1_CREDS
			print(HeadMessage + '\n' + Message)
		except:
			pass

credit card (do luhn check)

		CCMatch = re.findall(b'.{30}[^\d][3456][0-9]{3}[\s-]*[0-9]{4}[\s-]*[0-9]{4}[\s-]*[0-9]{4}[^\d]', decoded['data'],re.DOTALL)
		CC = re.findall(b'[^\d][456][0-9]{3}[\s-]*[0-9]{4}[\s-]*[0-9]{4}[\s-]*[0-9]{4}[^\d]', decoded['data'])

Add black + isort check

Currently, CI does not perform some important checks:

  • Black + isort
  • regex.json file (are entries correctly sorted?, do all regexes have ^(regex)$ format?)

Better URL Regex

We do not match on:

google.com

Because there is no HTTPS at the start.

The solution is to build a list of all top level domains ( see https://data.iana.org/TLD/tlds-alpha-by-domain.txt for all of them in a neat text file) and match only if the end matches a TLD.

An example regex is:

.*\.com|\.org

Which matches:

tryhackme.com

Boundaryless Regex broken when you want to turn off case sensitivity during a match

Describe the bug
When we check regex like:

{
      "Name": "Facebook Secret Key",
      "Regex": "(?i)^(facebook|fb)(.{0,20})?(?-i)['\\\"][0-9a-f]{32}['\\\"]",
      "plural_name": false,
      "Description": null,
      "Exploit": null,
      "Rarity": 1,
      "URL": null,
      "Tags": [
         "API Keys",
         "Bug Bounty",
         "Credentials"
      ]
   },
  {
      "Name": "LinkedIn Client ID",
      "Regex": "(?i)^linkedin(.{0,20})?(?-i)[0-9a-z]{12}$",
      "plural_name": false,
      "Description": null,
      "Exploit": null,
      "Rarity": 1,
      "URL": null,
      "Tags": [
         "Bug Bounty"
      ]
   },

Because of the (?-i) it messes up during boundaryless regex conversion. This is a bug :-( We should be able to handle this!

URL regex does not fully match every URL

For example:
image

I would like it to return both google.co and google.com. Sadly, it may be impossible considering the way regular expressions work. Thus, it would be amazing to match the longest string (pywhat google.com/help should return google.com/help). It is crucial for implementing URL subcategories properly(#51). Btw, URL regex is too long, I do not think that valid TLDs should be checked, so it may be shortened.

ToDo

  • Positional Arguments
  • JSON output, Python Dict API
  • Pretty printing of results
  • Run regex within regex
  • Magic Numbers
  • LangDetect
  • Credit card
  • Name that hash
  • #6
  • #5
  • Add strings #3
  • Add more regex #1
  • https://github.com/regexhq
  • Add categories / tabs

Add sorting support

Since we have filtration, it is logical to assume that sorting should be supported, too.
Therefore, I propose the following changes to API:

from pywhat import *
id = Identifier()
out = id.identify('fixtures/file', key=keys.rarity, reversed=True) # out[0] has the highest rarity
out = id.identify('fixtures/file', key=keys.matched) # sort alphabetically by matched string
out = id.identify('fixtures/file', key=keys.name) # sort by regex name

Also, as with distributions, it would be great to make it possible to specify keys while instantiating Identifier.
Something like that:

id = Identifier(key=keys.name)
id.identify('fixtures/file') # identical to id.identify('fixtures/file', key=keys.name)

Support for ULID, UUID/GUID and ObjectID

Awesome project, congrats!

A time ago, I try discover the code used by the uber gift card, just for validation. But without success, probably is a custom code.

Another detectors, nice to have, is the follow:

ULID: 01ERJ58HMWDN3VTRRHZQV2T5R5
UUID: b2ced6f5-2542-4f7d-b131-e3ada95d8b75
GUID: f0b93a8a-b808-4b92-9ba1-6acb977be8d1
ObjectID: 5fc7c33a7ef88b139122a38a

ToDo

This is my personal ToDo list, if you see something you think you can do please take it from me :-)

  • Add filtration system using distributions
  • Remove language checking stuff
  • Check speed of regex with no boundaries, potentially make all regex boundary-less

Add short-names to tags

For IP addresses we can do:

  • ipv4
  • ipv6

etc

This is so users can hand-select what regex they want via the tag system :D

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.